题意:给一张图,有火源,有障碍物,剩下的是道路,火源在下一分钟能够让上下左右四个方向的道路也着火,告诉人的位置,问最短时间能逃出去的时间是多少;

思路:一个bfs用来求出所有的火源能蔓延到的地方,另一个bfs求最短路,本来我以为bfs只能求最短路;

超级源:有多个源头的时候,就把所有的都压进去,每个源头能蔓延到的地方都看作是新的源头,继续压进去,每个只能蔓延4个方向,直到空;

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
#include <stack>
#include <cctype>
#include <utility>
#include <map>
#include <string>
#include <climits>
#include <set>
#include <string>
#include <sstream>
#include <utility>
#include <ctime>
using namespace std;
const int MAXN();
const int MAXM();
int fire[MAXN][MAXN];
char g[MAXN][MAXN];
bool vis[MAXN][MAXN];
int fx[MAXM], fy[MAXM];
int R, C, SX, SY;
struct NODE
{
int x, y, val;
NODE()
{}
NODE(int tx, int ty, int td): x(tx), y(ty), val(td)
{}
}; int ok(int nx,int ny)
{
if(nx >= && nx <= R && ny >= && ny <= C )
return ;
return ;
}
int move_x[] = {, -, , };
int move_y[] = {-, , , }; void bfs1(int n)///多个起点,超级源
{
queue<NODE> q;
memset(fire+, -, sizeof(fire));
for(int i = ; i < n; ++i)///起点都压进去
{
q.push(NODE(fx[i], fy[i], ));
fire[fx[i]][fy[i]] = ;
}
NODE cur;
while(!q.empty())
{
cur = q.front();///从一个起点开始,然后四个方向扩散
q.pop();
for(int i = ; i < ; ++i)
{
int nx = cur.x+move_x[i], ny = cur.y+move_y[i];
if(ok(nx,ny)&& g[nx][ny] != '#' && fire[nx][ny] == -)
{
fire[nx][ny] = cur.val+;
q.push(NODE(nx, ny, cur.val+));
///重新做一个新的起点
}
}
}
} int bfs2()
{
queue<NODE> q;
memset(vis+, false, sizeof(vis[])*R);
q.push(NODE(SX, SY, ));
vis[SX][SY] = true;
NODE cur;
while(!q.empty())
{
cur = q.front();
q.pop();
if(cur.x == || cur.y == || cur.x == R || cur.y == C)
return cur.val+;
for(int i = ; i < ; ++i)
{
int nx = cur.x+move_x[i], ny = cur.y+move_y[i];
if(ok(nx,ny)&& g[nx][ny] != '#' && !vis[nx][ny] && (fire[nx][ny] == - || cur.val+ < fire[nx][ny]))
{
vis[nx][ny] = true;
q.push(NODE(nx, ny, cur.val+));
}
}
}
return -;
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &R, &C);
int count = ;
for(int i = ; i <= R; ++i)
{
scanf("%s", g[i]+);
for(int j = ; j <= C; ++j)
{
if(g[i][j] == 'J')
{
SX = i;
SY = j;
}
if(g[i][j] == 'F')
{
fx[count] = i;
fy[count++] = j;
}
}
}
bfs1(count);
int ans = bfs2();
if(ans == -)
printf("IMPOSSIBLE\n");
else
printf("%d\n", ans);
}
return ;
}

UVA11624(bfs)的更多相关文章

  1. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  2. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  3. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  4. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  5. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  6. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  7. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

  8. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

  9. HDU.2612 Find a way (BFS)

    HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...

随机推荐

  1. FireFox背景亮度修改

    安装stylish 输入:body{filter: brightness(80%);}

  2. WindowsService(Windows服务)开发步骤附Demo 【转】

    转http://www.cnblogs.com/moretry/p/4149489.html 1.打开VS,新建项目,选择Windows服务,然后设置目录及项目名称后点击确定. 2.展开Service ...

  3. javaSE基础——常见的dos命令即其他

     常用的DOS命令 dir(directory) :    列出当前目录下的文件以及文件夹 md(make directory) : 创建目录 rd(remove directory) : 删除目录 ...

  4. 初学java之事件响应(结合接口来设置在同一个界面上!)

    package wahaha; public class test_1 { public static void main( String args[] ) { WindowActionEvent w ...

  5. HDUOJ----1234 开门人和关门人(浙江大学考研题)

    开门人和关门人 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  6. vue.js——初体验

    看到最近很火的vue.js,于是开启了自己人生中首篇翻译之路,才意识到这个纯英文版的的确没有中文的通俗易懂~~~~~~不过, 还是硬着头皮把这篇英文版的博客给翻译完了,希望可以帮助自己的同时也方便别人 ...

  7. WPF RichTextBox读取存储文本的方法和常用属性

    1. 取得已被选中的内容: (1)使用 RichTextBox.Document.Selection属性(2)访问RichTextBox.Document.Blocks属性的“blocks”中的Tex ...

  8. mysql 索引长度限制

    MyISAM存储引擎引键的长度综合不能超过1000字节 InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是3072

  9. Thinking in java之正则表达式小例子

    public static final String POEM= "Twas brilling, and the slithy toves\n" + "Did gyre ...

  10. FF与IE对JavaScript和CSS的区别

    一.FF与IE对JavaScript的区别 1. document.formName.item("itemName") 问题 说明:IE下,可以使用document.formNam ...