1 #include "stdio.h" 2 #include "queue" 3 #include "algorithm" 4 #include "iostream" 5 using namespace std ; 6 #define check(x,y)(x>0&&x<=hy&&y>0&&y<=wx) //判断是否在地图内 7 char map[1010][1010]; //地图 8 int wx,hy,sum; 9 int dx[4]={0,0,1,-1}; //方向的变化 10 int dy[4]={1,-1,0,0}; 11 struct node { 12 int x; 13 int y; 14 }; 15 void bfs(int x1,int y1){ 16 sum=1; 17 queue<node>q; //创建一个结构体队列 18 node start,next; //创建结构体 第一步 以及后一步的结构体 结构体存放坐标 19 start.x=x1; 20 start.y=y1; 21 q.push(start); //把点存入队列中 22 while (!q.empty()){ //判断队列是否为空 23 start=q.front(); //查找第一个结构体的值 24 q.pop(); //删除队首元素 25 for (int i = 0 ; i < 4; i++){ 26 next.x=start.x+dx[i]; 27 next.y=start.y+dy[i]; 28 if (check(next.x,next.y)&& map[next.x][next.y]=='.'){ 29 map[next.x][next.y]='#'; 30 sum++; 31 q.push(next); 32 } 33 } 34 } 35 } 36 37 int main (){ 38 int n,m; 39 while (~scanf ("%d%d",&wx,&hy)){ 40 if (wx==0&&hy==0)break; 41 for (int i = 1 ; i <= hy ; i++){ 42 for (int j = 1 ; j <= wx ; j++){ 43 cin>>map[i][j]; 44 if (map[i][j]=='@'){ 45 n=i; 46 m=j; 47 } 48 } 49 } 50 sum=0; 51 bfs(n,m); 52 printf ("%d ",sum); 53 } 54 }
一开始输入第一个案例,但输出只有1的时候。我很疑惑(黑人问号脸???),但还是回过头去重新把思路理了一遍。(= =)还是输出1,后来索性就把全部的案例都试一下。发现行数和列数相同的情况下,我的输出是正确的(伏笔伏笔)。我没有太在意,还是自顾自的修改自己的代码。经过长达30分钟的思考还是没能找到错误,没办法只得调试,在调试第一个案例的时候,我发现我BFS里面的判断语句居然没有一次执行下去的。思前想后,我决定check给删了,然后再执行。!!!居然输出了 正确的解???思考了一会后我终于发现了,i 是代表y的,而 j 是代表 x 的,所以我要么把这两的值换一下,要么把我的check函数里面x的越界判断与y的越界判断换一下,其实前面一种比较好理解,而且思路看的很清晰,但我还是用了后者,就当给自己一个教训吧。