题目传送门

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

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

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

代码:

/************************************************
* Author :Running_Time
* Created Time :2015-8-23 12:40:49
* File Name :J.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 12;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
struct Node {
int x, y, step;
};
Node g[N*N];
char maze[N][N];
int d[N][N];
bool vis[N][N];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int n, m, cnt, res; bool judge(int x, int y) {
if (x < 1 || x > n || y < 1 || y > m || vis[x][y] || maze[x][y] != '#') return false;
return true;
} void BFS(int sx, int sy, int ex, int ey) {
queue<Node> Q;
Q.push ((Node) {sx, sy, 0});
Q.push ((Node) {ex, ey, 0});
vis[sx][sy] = vis[ex][ey] = true;
while (!Q.empty ()) {
Node r = Q.front (); Q.pop ();
int x = r.x, y = r.y, step = r.step;
res = max (res, step);
for (int i=0; i<4; ++i) {
int tx = x + dx[i], ty = y + dy[i];
if (!judge (tx, ty)) continue;
vis[tx][ty] = true;
Q.push ((Node) {tx, ty, step + 1});
}
}
} bool check(void) {
for (int i=1; i<=cnt; ++i) {
int x = g[i].x, y = g[i].y;
if (!vis[x][y]) return false;
}
return true;
} int work(void) {
int ans = INF;
if (cnt <= 2) return 0;
for (int i=1; i<=cnt; ++i) {
for (int j=i+1; j<=cnt; ++j) {
memset (vis, false, sizeof (vis)); res = 0;
BFS (g[i].x, g[i].y, g[j].x, g[j].y);
if (check ()) ans = min (ans, res);
}
} if (ans == INF) return -1;
else return ans;
} int main(void) {
int T, cas = 0; scanf ("%d", &T);
while (T--) {
cnt = 0;
scanf ("%d%d", &n, &m);
for (int i=1; i<=n; ++i) {
scanf ("%s", maze[i] + 1);
for (int j=1; j<=m; ++j) {
if (maze[i][j] == '#') {
g[++cnt].x = i; g[cnt].y = j;
}
}
} printf ("Case %d: %d\n", ++cas, work ());
} return 0;
}

  

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. android framework navigationbar自定义

    需要实现的目标:在navigationbar上显示录像预览,并且点击按钮可以显示/隐藏NavigationBar 参考文章: http://blog.csdn.net/yanlai20/article ...

  2. idea使用之maven中央仓库索引更新

    接着上篇,上篇是更新本地已有的索引,这样在编写pom文件的时候,可以自动提示,但如果我们能够把整个中央仓库的索引更新下来,那不是更方便啦. 打开settings-->Build,Executio ...

  3. DNS域名服务器配置

    ========================DNS域名服务器===================== 1)bind安装: yum -y install bind* ............... ...

  4. hibernate详解一

    hibernate介绍 hibernate是一个开源的轻量级的框架, hibernate框架应用在javaee三层结构中的dao层框架,在dao层对数据库进行crud操作,使用hibernate框架实 ...

  5. Ubuntu 16.04安装QtCharts时报错:'qtConfig' is not a recognized test function.

    错误: 'qtConfig' is not a recognized test function. 解决方法: 其实5.9分支的版本有问题,转成5.7分支即可. git clone https://g ...

  6. Servlet的客户端请求

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/client-request.html: 当浏览器请求网页时,它会向Web服务器发送大量信息,这些 ...

  7. golang time.Duration()的问题解疑

    原文:  How to multiply duration by integer? 看到golang项目中的一段代码, ---------------------------------------- ...

  8. sh变更权限

    添加权限 假设您创建一个 “Hello world” 的 shell 脚本.当您第一次创建脚本时,它通常是不可执行的.使用 chmod 命令和 +x 选项添加执行权限,如清单 5 所示. 清单 5. ...

  9. 安卓数据传递之---putextra与putextras

    一.public Intent putExtra (String name, double[] value) 设置方法 intent.putExtra("aaa", "b ...

  10. HDU 4923 Room and Moor(瞎搞题)

    瞎搞题啊.找出1 1 0 0这样的序列,然后存起来,这样的情况下最好的选择是1的个数除以这段的总和. 然后从前向后扫一遍.变扫边进行合并.每次合并.合并的是他的前驱.这样到最后从t-1找出的那条链就是 ...