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.输入以字符形式输入。

posted @ 2014-10-22 23:47  小白v  阅读(179)  评论(0编辑  收藏  举报