第一次用DFS做给坑了,第二次BFS又给坑了。纪念一下 #杭电1312

 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的越界判断换一下,其实前面一种比较好理解,而且思路看的很清晰,但我还是用了后者,就当给自己一个教训吧。

原文地址:https://www.cnblogs.com/AChappy/p/11954757.html