UVA11624(bfs)
题意:给一张图,有火源,有障碍物,剩下的是道路,火源在下一分钟能够让上下左右四个方向的道路也着火,告诉人的位置,问最短时间能逃出去的时间是多少;
思路:一个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)的更多相关文章
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- 【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- 【BZOJ5492】[HNOI2019]校园旅行(bfs)
[HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 层层递进——宽度优先搜索(BFS)
问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...
- HDU.2612 Find a way (BFS)
HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...
随机推荐
- jquery 获取属性的值
jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到attr(),attr()有4个表达式. 1. attr( 属 ...
- Qt之绘制闪烁文本
简述 根据之前的二位绘图,我们可以很轻松的进行文本的绘制,如果需要一些特效,比如:文本闪烁.我们就必须借助其它辅助类来完成. 简述 原理 实现 效果 源码 原理 主要涉及两个辅助类: QFontMet ...
- win8 卸载IIS
C:\Windows\System32\inetsrv C:\Windows\iis7.log C:\inetpub
- Populating Next Right Pointers in Each Node [LeetCode]
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...
- ztree 展示
1. controller@RequestMapping("/function.htm") public String function(HttpSession session, ...
- android:ems
<EditText android:id="@+id/qq_number" android:layout_width="wrap_content" and ...
- Visual Studio 2010 类模板的修改
第一步:找到类文件模板路径 C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\C ...
- mysqldump导出--数据+结构+(函数+存储过程)
#导出某个数据库--结构+数据shell>mysqldump -h192.168.161.124 -uroot -pxxxxxx --opt db_name |gzip -9 > /db_ ...
- sql server中备份数据的几种方式
当我们在写sql脚本要对数据表中的数据进行修改的时候,为了防止破坏数据,通常在开发前都会对数据表的数据进行备份,当我们sql脚本开发并测试完成后,再把数据恢复回来. 目前备份数据,我常用的方法有以下几 ...
- Sharepoint2010突然之间不能打开页面,报503错误The service is unavailable
原因:安装Sahrepoint时的账号出现故障,可能是密码过期等等. 解决方案: 新建windows用户ada,密码设置为永不过期,隶属于:administrators/IIS-WPG/WSS-WPG ...