Uva 352 The Seasonal War
1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 6 int IsVis[26][26];//记录位置是否被访问 7 char Eagles[26][26]; 8 typedef struct node 9 { 10 int x,y; 11 }War; 12 int Move[8][2]={-1,0, 0,1, 1,1, 1,0, -1,1, 0,-1, 1,-1, -1,-1};//移动方位 13 void Bfs(int x,int y); 14 int Judge(); 15 int line,EaglesNum; 16 queue<War> Que; 17 int main(){ 18 19 //freopen("D:\\t.txt","r",stdin); 20 int flag = 1; 21 while(cin>>line){ 22 23 for(int i = 0;i< line;i++){ 24 for(int j = 0;j < line;j++){ 25 cin>>Eagles[i][j]; 26 } 27 } 28 EaglesNum = Judge(); 29 cout<<"Image number "<< flag <<" contains "<<EaglesNum<<" war eagles."<<endl; 30 flag++; 31 } 32 return 0; 33 } 34 int Judge(){ 35 War p; 36 int Num = 0; 37 memset(IsVis,0,sizeof(IsVis));//每一回合初始化 38 for(int i = 0;i< line;i++){ 39 for(int j = 0;j < line;j++){ 40 if(Eagles[i][j] == '1' && !IsVis[i][j]){ 41 p.x = i; 42 p.y = j; 43 Que.push(p); 44 Bfs(i,j); 45 Num++; 46 } 47 } 48 } 49 return Num; 50 } 51 void Bfs(int x,int y){ 52 War m,n; 53 while(!Que.empty()){ 54 m = Que.front(); 55 IsVis[m.x][m.y] = 1; 56 for(int k = 0;k < 8;k++){ 57 if((m.x + Move[k][0] >= 0) && (m.x + Move[k][0] < line) && (m.y + Move[k][1] >= 0) && (m.y + Move[k][1] < line) 58 && !IsVis[m.x + Move[k][0]][m.y + Move[k][1]]){//判断移动是否超范围及是否被访问 59 n.x = m.x + Move[k][0]; 60 n.y = m.y + Move[k][1]; 61 IsVis[n.x][n.y] = 1; 62 if(Eagles[n.x][n.y] == '1')Que.push(n); 63 } 64 } 65 Que.pop(); 66 } 67 }
修改后的代码
bfs的题目。
1.注意队列使用;
2.注意移动范围;
3.输入以字符形式输入。
Donghua University