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) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...
随机推荐
- Spring配置文件解析--bean属性
1.bean设置别名,多个别名用逗号隔开 <!--使用alias--> <bean id="app:dataSource" class="...&quo ...
- HTML第一部分
HTML 内容(hyper text markup language,超文本标记语言) CSS 网页美化 Javacript 脚本语言 第一部分 HTML <html ...
- [转]Java8-本地缓存
这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存.因为Map有一个新的方法可以在key为Null的时候自动计算一个新的value值.非常完美的实现cach ...
- 为什么要使用 F#?
对于小部分 .NET 程序员来说,学习一门 .NET Framework 函数化语言无疑将使自己在编写功能强大软件方面前进一大步.而对其他程序员来说,学习 F# 的理由就因人而异了.F# 能为开发 ...
- sqlserver 2008 存储过程调用存储过程或方法
函数:拆分字符串,并返回一个table CREATE FUNCTION [dbo].[f_splitSTR](@s varchar(max), --待分拆的字符串@split varchar(10) ...
- 使用SMSManager短信管理器发送短信
import android.os.Bundle;import android.app.Activity;import android.app.PendingIntent;import android ...
- 获取手机通讯录放入PinnedSectionListView中,按名字首字母排序,并且实现拨打电话功能。
package com.lixu.tongxunlu; import java.util.ArrayList; import com.lixu.tongxunlu.PinnedSectionListV ...
- js基础之弹性运动(四)
一.滑动菜单.图片 var iSpeed=0;var left=0;function startMove(obj,iTarg){ clearInterval(obj.timer);//记得先关定时器 ...
- 部分SIM卡被曝存安全漏洞:7.5亿部手机受牵连
7月22日消息,据国外媒体报道,一安全研究人员发现部分移动SIM卡所使用的加密方式存在一个安全漏洞,可能会导致手机被黑客远程控制. DES数据加密标准的SIM卡——DES是一种较旧的标准,目前正被部分 ...
- ios的 对象归档
IOS提供的数据持久化方式有:SQLite.CoreData.属性列表.NSUserDefault.对象归档. 这里来简单介绍下对象归档: 对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化, ...