题目传送门

题意:'#'表示草地,两个人在草地上点火,相邻的草地会烧起来,每烧一格等1秒,问最少要等几秒草地才烧完

分析:这题和UVA 11624 Fire!有点像,那题给定了两个点,这题两点不确定,取最小值。可以仿照11624的做法,两次BFS,第二次更新最小值,这样我跑了900多ms。后来发现不需要这样,枚举两个点,将它们一起入队,vis过的点一定已经是最优的,广搜的特点。

收获:1. 进一步理解BFS的过程 2. 差错能力有待提高 3. 写过的题一定要总结!(刚刷过专题!!!)

代码:

  1. /************************************************
  2. * Author :Running_Time
  3. * Created Time :2015-8-23 12:40:49
  4. * File Name :J.cpp
  5. ************************************************/
  6.  
  7. #include <cstdio>
  8. #include <algorithm>
  9. #include <iostream>
  10. #include <sstream>
  11. #include <cstring>
  12. #include <cmath>
  13. #include <string>
  14. #include <vector>
  15. #include <queue>
  16. #include <deque>
  17. #include <stack>
  18. #include <list>
  19. #include <map>
  20. #include <set>
  21. #include <bitset>
  22. #include <cstdlib>
  23. #include <ctime>
  24. using namespace std;
  25.  
  26. #define lson l, mid, rt << 1
  27. #define rson mid + 1, r, rt << 1 | 1
  28. typedef long long ll;
  29. const int N = 12;
  30. const int INF = 0x3f3f3f3f;
  31. const int MOD = 1e9 + 7;
  32. struct Node {
  33. int x, y, step;
  34. };
  35. Node g[N*N];
  36. char maze[N][N];
  37. int d[N][N];
  38. bool vis[N][N];
  39. int dx[4] = {-1, 1, 0, 0};
  40. int dy[4] = {0, 0, -1, 1};
  41. int n, m, cnt, res;
  42.  
  43. bool judge(int x, int y) {
  44. if (x < 1 || x > n || y < 1 || y > m || vis[x][y] || maze[x][y] != '#') return false;
  45. return true;
  46. }
  47.  
  48. void BFS(int sx, int sy, int ex, int ey) {
  49. queue<Node> Q;
  50. Q.push ((Node) {sx, sy, 0});
  51. Q.push ((Node) {ex, ey, 0});
  52. vis[sx][sy] = vis[ex][ey] = true;
  53. while (!Q.empty ()) {
  54. Node r = Q.front (); Q.pop ();
  55. int x = r.x, y = r.y, step = r.step;
  56. res = max (res, step);
  57. for (int i=0; i<4; ++i) {
  58. int tx = x + dx[i], ty = y + dy[i];
  59. if (!judge (tx, ty)) continue;
  60. vis[tx][ty] = true;
  61. Q.push ((Node) {tx, ty, step + 1});
  62. }
  63. }
  64. }
  65.  
  66. bool check(void) {
  67. for (int i=1; i<=cnt; ++i) {
  68. int x = g[i].x, y = g[i].y;
  69. if (!vis[x][y]) return false;
  70. }
  71. return true;
  72. }
  73.  
  74. int work(void) {
  75. int ans = INF;
  76. if (cnt <= 2) return 0;
  77. for (int i=1; i<=cnt; ++i) {
  78. for (int j=i+1; j<=cnt; ++j) {
  79. memset (vis, false, sizeof (vis)); res = 0;
  80. BFS (g[i].x, g[i].y, g[j].x, g[j].y);
  81. if (check ()) ans = min (ans, res);
  82. }
  83. }
  84.  
  85. if (ans == INF) return -1;
  86. else return ans;
  87. }
  88.  
  89. int main(void) {
  90. int T, cas = 0; scanf ("%d", &T);
  91. while (T--) {
  92. cnt = 0;
  93. scanf ("%d%d", &n, &m);
  94. for (int i=1; i<=n; ++i) {
  95. scanf ("%s", maze[i] + 1);
  96. for (int j=1; j<=m; ++j) {
  97. if (maze[i][j] == '#') {
  98. g[++cnt].x = i; g[cnt].y = j;
  99. }
  100. }
  101. }
  102.  
  103. printf ("Case %d: %d\n", ++cas, work ());
  104. }
  105.  
  106. return 0;
  107. }

  

BFS(两点搜索) FZOJ 2150 Fire Game的更多相关文章

  1. BFS(两点搜索) UVA 11624 Fire!

    题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...

  2. FZOJ Problem 2150 Fire Game

                                                                                                        ...

  3. fzu 2150 Fire Game 【身手BFS】

    称号:fzupid=2150"> 2150 Fire Game :给出一个m*n的图,'#'表示草坪,' . '表示空地,然后能够选择在随意的两个草坪格子点火.火每 1 s会向周围四个 ...

  4. FZU 2150 fire game (bfs)

    Problem 2150 Fire Game Accept: 2133    Submit: 7494Time Limit: 1000 mSec    Memory Limit : 32768 KB ...

  5. FZU Problem 2150 Fire Game

    Problem 2150 Fire Game Accept: 145    Submit: 542 Time Limit: 1000 mSec    Memory Limit : 32768 KB P ...

  6. FZU 2150 Fire Game(点火游戏)

    FZU 2150 Fire Game(点火游戏) Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description - 题目描述 ...

  7. BFS广度优先搜索 poj1915

    Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25909 Accepted: 12244 Descri ...

  8. 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想

    dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...

  9. 图的遍历BFS广度优先搜索

    图的遍历BFS广度优先搜索 1. 简介 BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法在一个结点"死磕到底"的思维不同,广度优先 ...

随机推荐

  1. Eclipse4.5在线安装Aptana插件及配置代码提示教程

    一.Aptana插件官网地址         我在网上试过登陆到aptana官网后点击下载,选择下载eclipse插件版,然后页面给出一串地址:http://download.aptana.com/s ...

  2. 【HDOJ4322】Candy(费用流)

    题意:给N个孩子分配M个糖果. 有一个N*M的矩阵表示孩子和糖果的关系,若第i行第j列的数是1则表示第i个孩子喜欢第j个糖果,反之不喜欢. 已知,若一个孩子被分配到他喜欢的糖果那么他将获得K的快乐值, ...

  3. spring security 5.0 密码未加密报错

    使用spring security5.0后,配置文件中直接写普通的密码如:123456,会报错: java.lang.IllegalArgumentException: There is no Pas ...

  4. Linux下汇编语言学习笔记65 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  5. [bzoj2561]最小生成树_网络流_最小割_最小生成树

    最小生成树 bzoj-2561 题目大意:题目链接. 注释:略. 想法: 我们发现: 如果一条权值为$L$的边想加入到最小生成树上的话,需要满足一下条件. 就是求出原图的最小生成树之后,这个边当做非树 ...

  6. maven项目互相dependcy依赖问题

    1.自己编写的maven项目,在编译后,也会在.m2文件夹下生成jar包,可以供第三方引用使用. 2.比如几个项目互相依赖对方的jar包,就要首先选择编译哪个jar包,编译完成后生成jar,再编译依赖 ...

  7. 作为一名CEO

    你 不能怕得罪人 不能奢望完成工作的时候 有太多的愉悦感 你 必须要去做左右为难但左右亦可的 操蛋决策 你 得脸皮够厚 肚囊儿宽超 什么事情都能快速消化 哪怕 是 一坨屎 你 还得 决不放弃 永不言败 ...

  8. AIM Tech R3 div2 E Centroid

    思路很明显了,假设是点x,则看它的子树中是否有大于n/2的,如果有,则在该子树中剪去它可以剪的且小于n/2的,接到点x上. 则统计出在以x点为根的子树中,它的各子树可以剪去的且小于n/2的最大子子树. ...

  9. java List.add操作可以指定位置

    java List.add操作可以指定位置,addAll也可以指定: 使用: public class Test02 { public static void main(String[] args) ...

  10. 某法院HP-P4500存储数据恢复案例

    好久没出来写博客了.过春节来了一直非常忙.尤其是近期,忙着做了好几个大单子.先是一个医院50TB的HP-EVA4400,接着是一个法院12TB的HP-P4500,前几天还有做了一个某游乐城12TB的V ...