BFS 简单题套路

1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明

  1. const int maxn = ;
  2. struct Status {
  3. int r, c;
  4. Status(int r = , int c = ) : r(r), c(c) {}
  5. // int DIR;
  6. };
  7. int N; //迷宫数量
  8. int W; //迷宫宽度
  9. char map[maxn][maxn]; //地图
  10. //方向 : 分别代表 上、右、下、左向量
  11. int dir[][] = { {-, }, {, }, {, }, {, -} };
  12. bool vis[maxn][maxn];
  13. //队列
  14. queue<Status> que;
  15. void input(); //输入数据
  16. bool judge(int r, int c);//判断是否越界, 是否是路
  17. bool check(int r, int c);//判断当前是否到达终点
  18. //移动一步
  19. void Move(const Status& now, int r, int c, int k);
  20. void BFS(); //BFS搜索
  21. void solve();

2. 随后再逐个函数的实现

  1. //完整代码
  2. /*
  3. * Codevs 1215 迷宫
  4. */
  5. #include <iostream>
  6. #include <queue>
  7. #include <cstring>
  8. #include <cstdio>
  9. #include <cstdlib>
  10. using namespace std;
  11. const int maxn = ;
  12. struct Status {
  13. int r, c;
  14. Status(int r = , int c = ) : r(r), c(c) {}
  15. // int DIR;
  16. };
  17. int N; //迷宫数量
  18. int W; //迷宫宽度
  19. char map[maxn][maxn]; //地图
  20. //方向 : 分别代表 上、右、下、左向量
  21. int dir[][] = { {-, }, {, }, {, }, {, -} };
  22. bool vis[maxn][maxn];
  23. //队列
  24. queue<Status> que;
  25. void input(); //输入数据
  26. bool judge(int r, int c);//判断是否越界, 是否是路
  27. bool check(int r, int c);//判断当前是否到达终点
  28. //移动一步
  29. void Move(const Status& now, int r, int c, int k);
  30. void BFS(); //BFS搜索
  31. void solve(); //启动
  32. void input()
  33. {
  34. memset(map, , sizeof(map));
  35. memset(vis, , sizeof(vis));
  36. while (!que.empty()) que.pop();
  37. scanf("%d", &W);
  38. getchar();
  39. for (int i = ; i < W; i++) {
  40. scanf("%s", map[i]);
  41. }
  42. }
  43. bool judge(int r, int c)
  44. {
  45. return (r >= && r < W) && (c >= && c < W)
  46. && map[r][c] != '#';
  47. }
  48. bool check(int r, int c)
  49. {
  50. return (r == W- && c == W-) && map[r][c] == 'e';
  51. }
  52. void Move(const Status& now, int r, int c, int k)
  53. {
  54. Status tmp = now;
  55. int tmpx = tmp.r;
  56. int tmpy = tmp.c;
  57. tmpx += dir[k][];
  58. tmpy += dir[k][];
  59. //判断是否越界, 是否是路, 是否走过
  60. if (!judge(tmpx, tmpy) || vis[tmpx][tmpy]) return;
  61. if (check(tmpx, tmpy)) {
  62. printf("YES\n");
  63. exit();
  64. }
  65. vis[tmpx][tmpy] = true;
  66. que.push(Status(tmpx, tmpy));
  67. }
  68. void BFS()
  69. {
  70. que.push(Status(, ));
  71. while (!que.empty())
  72. {
  73. Status now = que.front(); que.pop();
  74. int r = now.r, c = now.c;
  75. for (int k = ; k < ; k++) {
  76. Move(now, r, c, k);
  77. }
  78. }
  79. printf("NO\n");
  80. }
  81. void solve()
  82. {
  83. scanf("%d", &N);
  84. while (N--) {
  85. input();
  86. BFS();
  87. }
  88. }
  89. int main()
  90. {
  91. solve();
  92. return ;
  93. }

BFS简单题套路_Codevs 1215 迷宫的更多相关文章

  1. bfs简单题-poj2251

    宽搜基础题 思路很简单,注意细节. 走过的节点一定要打上标记//tag数组 三维字符串输入一定要注意 #include <stdio.h> #include <iostream> ...

  2. 胜利大逃亡(杭电hdu1253)bfs简单题

    胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  3. POJ 3984 - 迷宫问题 - [BFS水题]

    题目链接:http://poj.org/problem?id=3984 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, ...

  4. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  5. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  6. BZOJ 2683: 简单题

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 913  Solved: 379[Submit][Status][Discuss] ...

  7. 【BZOJ-1176&2683】Mokia&简单题 CDQ分治

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  8. Bzoj4066 简单题

    Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 2185  Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...

  9. Bzoj2683 简单题

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...

随机推荐

  1. Visual Studio控制台程序输出窗口一闪而过的解决方法

    转载大牛的博客,自己也遇到了类似的问题,解决方法很详细,也很管用   刚接触 Visual Studio的时候大多数人会写个Hello World的程序试一下,有的人会发现执行结束后输出窗口会一闪而过 ...

  2. ELK安装部署

    一.ELK简介 ELK是Elasticsearch.Logstash.Kibana的简称,这三者是核心套件,但并非全部.Elasticsearch是实时全文搜索和分析引擎,提供搜集.分析.存储数据三大 ...

  3. 云服务器+tomcat+mysql+web项目搭建部署

    云服务器+tomcat+mysql+web项目搭建部署 1.老样子,开头墨迹两句. 作为我的第二篇文章,有很多感慨,第一篇人气好低啊,有点小丧气,不过相信我还是经验少,分享的都是浅显的,所以大家可能不 ...

  4. Redis源码阅读(二)高可用设计——复制

    Redis源码阅读(二)高可用设计-复制 复制的概念:Redis的复制简单理解就是一个Redis服务器从另一台Redis服务器复制所有的Redis数据库数据,能保持两台Redis服务器的数据库数据一致 ...

  5. python 游戏(船只寻宝)

    1. 游戏思路和流程图 实现功能:船只在可以在大海上移动打捞宝藏,船只可以扫描1格范围内的宝藏(后续难度,可以调整扫描范围,可以调整前进的格数) 游戏流程图 2. 使用模块和游戏提示 import r ...

  6. UVALive 4877 Non-Decreasing Digits 数位DP

    4877 Non-Decreasing Digits A number is said to be made up ofnon-decreasing digitsif all the digits t ...

  7. LeetCode-----算法448.找到所有数组中消失的数字

    题目: 给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. ...

  8. TUANDUIZUOYE

     [组队后的项目整体计划安排]  - 学习:先学习基础知识,懂得该做什么,后边做边学,在实践中成长: - 项目:根据迭代原则,先完成较简单的功能,而后进攻较难功能,保证项目的最终完成度.  阶段序列  ...

  9. Beta版本冲刺(三)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  10. word漏洞分析与利用

    众所周知,溢出漏洞从应用形式上可分为远程服务溢出漏洞和客户端(本地)溢出漏洞两类.远程服务溢出漏洞大家很熟悉了,红色代码.冲击波.振荡波等蠕虫都利用了此类漏洞,漏洞的调试和利用有相应的一套方法,前面的 ...