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

  • 相关阅读:
    解释机器学习模型的一些方法(一)——数据可视化
    机器学习模型解释工具-Lime
    Hive SQL 语法学习与实践
    LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)
    LeetCode 148. 排序链表(Sort List)
    LeetCode 18. 四数之和(4Sum)
    LeetCode 12. 整数转罗马数字(Integer to Roman)
    LeetCode 31. 下一个排列(Next Permutation)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    论FPGA建模,与面向对象编程的相似性
  • 原文地址:https://www.cnblogs.com/AChappy/p/11954757.html
Copyright © 2011-2022 走看看