ZOJ 2165题解此题不算难可是有一些细节需注意,很容易出错。总归就是BFS加队列,用STL实现较方便

 1 #include<cstdio>
2 #include<iostream>
3 #include<queue>
4
5 using namespace std;
6
7 queue<int>q;
8 int main()
9 {
10 int i, w, h, k, j;
11 int visit[21][21];
12 char s[21][21];
13
14 while(scanf("%d%d", &w, &h) != EOF)
15 {
16 if(w==0 && h==0) break;
17 getchar(); //此处是为了处理enter换行键,不能省,此处较容易出错,我也是调了两个小时才恍然大悟。
18 for(i=1; i<=h; i++)
19 {
20 for(j=1; j<=w; j++)
21 {
22 scanf("%c",&s[i][j]);
23 if(j==w) getchar();//此处和上述一样为了处理换行符。
24 }
25 }
26 for(i=1; i<=h; i++)
27 {
28 for(j=1; j<=w; j++)
29 {
30 if(s[i][j]=='@')
31 {
32 visit[i][j] = 1;//标记后就不能访问了
33 q.push(i);
34 q.push(j);
35 }
36 if(s[i][j]=='#')
37 visit[i][j] = 1//和上述标记一样
38 if(s[i][j]=='.')
39 visit[i][j] = 0;
40 }
41 }
42 k = 0; //每次访问结束后队首出队,记录出队多少次,就可知道访问几次,从而可判断访问到了几个','
43 while(!q.empty())
44 {
45 int x, y;
46 x = q.front();
47 q.pop();
48 y = q.front();
49 q.pop();
50 k++;
51 if(visit[x-1][y]==0 && x-1>=1)
52 {
53 visit[x-1][y] = 1;
54 q.push(x-1);
55 q.push(y);
56 }
57 if(visit[x+1][y]==0 && x+1<=h)
58 {
59 visit[x+1][y] = 1;
60 q.push(x+1);
61 q.push(y);
62 }
63 if(visit[x][y+1]==0 && y+1<=w)
64 {
65 visit[x][y+1] = 1;
66 q.push(x);
67 q.push(y+1);
68 }
69 if(visit[x][y-1]==0 && y-1>=1)
70 {
71 visit[x][y-1] = 1;
72 q.push(x);
73 q.push(y-1);
74 }
75 }
76 printf("%d\n",k);
77 }
78 return 0;
79 }
80
81
posted @ 2011-08-22 16:07  zhongya  阅读(232)  评论(0编辑  收藏  举报