题目链接:http://poj.org/problem?id=2312

挺有趣的一道题目,然而很容易WA,我就WA了一次,虽然我Debug的时候已经知道哪里出问题了,就是比如说我搜到B和E时,从B搜第三个点,B左边的E就被搜了,step为3,然而其实他是step为2,

这里的处理方法很是巧妙,可以从B出发时,把B换成E,step+1,形成一个新的结点加入到队列中去.

之后,和杰哥交流了这下题,我对这个BFS又有了新的一点认识,BFS时,每次搜索的点,都要是同一级别的点,想这里B,和E就不是同一级别的点,所以将这个B,分成两部,注意B搜完后不要标记,B还没有访问完。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. int to[][]= {{-,},{,},{,-},{,}};
  8.  
  9. struct Point
  10. {
  11. int r,c;
  12. int step;
  13. };
  14. int r,c;
  15. char maps[][];
  16. bool vis[][];
  17.  
  18. bool judge (int rx,int cx)
  19. {
  20. if(rx<||rx>=r||cx<||cx>=c||maps[rx][cx]=='S'||maps[rx][cx]=='R'||vis[rx][cx])
  21. return true;
  22. else return false;
  23. }
  24.  
  25. int main()
  26. {
  27. int sr,sc;
  28. while(scanf("%d%d",&r,&c),r)
  29. {
  30. memset(vis,false,sizeof(vis));
  31.  
  32. for(int i=; i<r; i++)
  33. {
  34. scanf("%s",maps[i]);
  35. for(int j=; j<c; j++)
  36. {
  37. if(maps[i][j]=='Y')
  38. {
  39. sr = i;
  40. sc = j;
  41. }
  42. }
  43. }
  44. int ans = -;
  45.  
  46. queue<Point> Q;
  47. Point a,next;
  48. a.r = sr;
  49. a.c = sc;
  50. a.step = ;
  51. vis[a.r][a.c] = true;
  52. Q.push(a);
  53. while(!Q.empty())
  54. {
  55. a = Q.front();
  56. Q.pop();
  57.  
  58. if(maps[a.r][a.c]=='T')
  59. {
  60. ans = a.step;
  61. break;
  62. }
  63. if(maps[a.r][a.c]=='B')
  64. {
  65. a.step ++;
  66. maps[a.r][a.c] = 'E';
  67. Q.push(a);
  68. continue;
  69. }
  70.  
  71. for(int i=; i<; i++)
  72. {
  73. next.r = a.r + to[i][];
  74. next.c = a.c + to[i][];
  75. if(judge(next.r,next.c))
  76. continue;
  77. vis[next.r][next.c] = true;
  78. next.step = a.step +;
  79. Q.push(next);
  80.  
  81. }
  82.  
  83. }
  84. printf("%d\n",ans);
  85. }
  86. return ;
  87. }

Poj(2312),坦克大战,BFS的变形的更多相关文章

  1. NYOJ 284 坦克大战 bfs + 优先队列

    这类带权的边的图,直接广搜不行,要加上优先队列,这样得到的结果才是最优的,这样每次先找权值最小的,代码如下 #include <stdio.h> #include <iostream ...

  2. POJ - 2312 Battle City BFS+优先队列

    Battle City Many of us had played the game "Battle city" in our childhood, and some people ...

  3. poj 2312 Battle City【bfs+优先队列】

      Battle City Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7579   Accepted: 2544 Des ...

  4. NYOJ 284 坦克大战 【BFS】+【优先队列】

    坦克大战 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 Many of us had played the game "Battle city" ...

  5. nyoj-----284坦克大战(带权值的图搜索)

    坦克大战 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 Many of us had played the game "Battle city" ...

  6. nyoj 284 坦克大战 简单搜索

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=284 题意:在一个给定图中,铁墙,河流不可走,砖墙走的话,多花费时间1,问从起点到终点至少 ...

  7. 3D坦克大战游戏源码

    3D坦克大战游戏源码,该游戏是基于xcode 4.3,ios sdk 5.1开发.在xcode4.3.3上完美无报错.兼容ios4.3-ios6.0 ,一款ios平台上难得的3D坦克大战游戏源码,有2 ...

  8. 【blade04】用面向对象的方法写javascript坦克大战

    前言 javascript与程序的语言比如C#或者java不一样,他并没有“类”的概念,虽然最新的ECMAScript提出了Class的概念,我们却没有怎么用 就单以C#与Java来说,要到真正理解面 ...

  9. 3D坦克大战游戏iOS源码

    3D坦克大战游戏源码,该游戏是基于xcode 4.3,ios sdk 5.1开发.在xcode4.3.3上完美无报错.兼容ios4.3-ios6.0 ,一款ios平台上难得的3D坦克大战游戏源码,有2 ...

随机推荐

  1. vue(1)安装

    1.安装node.js(https://nodejs.org/en/),我安装的是 v10.15.1 1).在nodejs安装路径下,新建node_global和node_cache两个文件夹 2). ...

  2. python—datetime time 模板学习

    写在前面:本人在学习此内容是通过 https://www.cnblogs.com/pycode/p/date.html 文章学习! 时间模块——time python 中时间表示方法有:时间戳_:格式 ...

  3. MapReduce的主要的六个类讲解

    a.InputFormat类.该类的作用是将输入的文件和数据分割成许多小的split文件, 并将split的每个行通过LineRecorderReader解析成<Key,Value>,通过 ...

  4. robot framework 的AutoItLibrary常用关键字

    1.run 的用法,以及激活当前窗口

  5. android studio NDK配置

    向您的项目添加 C 和 C++ 代码 本文内容 下载 NDK 和构建工具 创建支持 C/C++ 的新项目 构建和运行示例应用 向现有项目添加 C/C++ 代码 创建新的原生源文件 创建 CMake 构 ...

  6. spring webapp的配置文件放置在项目外的方法

    在web.xml中,填写     <context-param>         <param-name>CFG_HOME</param-name>         ...

  7. iterable- 什么是可迭代对象

    什么是可迭代对象? 可以被For循环执行的 字符串.列表这2个是可迭代对象

  8. Unity Resources.Load

    GameObject bulletPrefab; void Start() {   bulletPrefab = Resources.Load("bulletPrefab")  a ...

  9. git使用笔记-比较分支差异

    比如我们有 2 个分支:master, dev,现在想查看这两个 branch 的区别,有以下几种方式: 1.查看 dev 有,而 master 中没有的: git log dev ^master 同 ...

  10. ORACLE SQL 实现IRR的计算

    一.IRR计算的原理: 内部收益率(Internal Rate of Return (IRR)),就是资金流入现值总额与资金流出现值总额相等.净现值等于零时的折现率. 用公式 标识:-200+[30/ ...