UVa 11624 大火蔓延的迷宫
https://vjudge.net/problem/UVA-11624
题意:
有一个大火蔓延的迷宫,迷宫中有障碍格,而所有着火的格子都会往四周蔓延。求出到达边界格子时的最短时间。
思路:
复杂了一点的迷宫。
在bfs之前,我们首先需要计算出火势蔓延的情况,火势每次向四周蔓延一个格子,所以这也是一个最短路问题,也用一次bfs,计算出每个空白格子着火时的时间。这样,当我们第二次bfs去计算走出迷宫的时间时,对于每一个可走的格子,我们只需要判断在此时该格子是否着火,如果还未着火,则该格子是可以走的。
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std; const int maxn = + ; int map[maxn][maxn];
int fire[maxn][maxn];
int vis[maxn][maxn]; int dx, dy;
int n, m; int sx[] = { , , , - };
int sy[] = { , -, , }; struct node
{
int x, y;
int t;
}; void bfs1()
{
memset(fire, -, sizeof(fire));
queue<node> Q;
for (int i = ; i < n;i++)
for (int j = ; j < m; j++)
{
if (map[i][j] == -)
{
node p;
p.x = i;
p.y = j;
p.t = ;
Q.push(p);
fire[i][j] = ;
}
}
while (!Q.empty())
{
node p = Q.front();
Q.pop();
for (int k = ; k < ; k++)
{
int x = p.x + sx[k];
int y = p.y + sy[k];
if (x < || x >= n || y < || y >= m) continue;
if (map[x][y] != ) continue;
if (fire[x][y] != -) continue;
fire[x][y] = p.t + ;
node u;
u.x = x;
u.y = y;
u.t = p.t + ;
Q.push(u);
}
}
} int bfs2()
{
memset(vis, , sizeof(vis));
queue<node> Q;
node p;
p.x = dx;
p.y = dy;
p.t = ;
Q.push(p);
vis[dx][dy] = ;
while (!Q.empty())
{
node p = Q.front();
Q.pop();
if (p.x == || p.x == n - || p.y == || p.y == m - ) return p.t;
for (int k = ; k < ; k++)
{
int x = p.x + sx[k];
int y = p.y + sy[k];
if (vis[x][y]) continue;
if (x < || x >= n || y < || y >= m) continue;
if (map[x][y] != ) continue;
if (fire[x][y]!=- && p.t + >= fire[x][y]) continue;
node u;
u.x = x;
u.y = y;
u.t = p.t + ;
Q.push(u);
vis[x][y] = ;
}
}
return -;
} int main()
{
ios::sync_with_stdio(false);
//freopen("D:\\txt.txt", "r", stdin);
int T;
char c;
cin >> T;
while (T--)
{
cin >> n >> m;
for (int i = ; i < n;i++)
for (int j = ; j < m; j++)
{
cin >> c;
if (c == '#') map[i][j] = ;
else if (c == 'F') map[i][j] = -;
else if (c == 'J')
{
map[i][j] = ;
dx = i;
dy = j;
}
else map[i][j] = ;
} bfs1();
int ans=bfs2();
if (ans == -) cout << "IMPOSSIBLE" << endl;
else cout << ans << endl;
}
}
UVa 11624 大火蔓延的迷宫的更多相关文章
- UVA11624大火蔓延的迷宫
题意: 给1个n*m的网格,上面有的点能走,有的点不能走(墙),然后有的点是火源,火源和人一样,每次都是上下左右四个方向蔓延,速度一样是1,火也不可以从墙上跨过去,给你人的起点,终点是只要走到 ...
- UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次
UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...
- E - Fire! UVA - 11624(bfs + 记录火到达某个位置所需要的最小时间)
E - Fire! UVA - 11624 题目描述 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必 ...
- UVa 11624 Fire!(着火了!)
UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...
- BFS(两点搜索) UVA 11624 Fire!
题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...
- UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题
很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M): UVA 11624 写的比较挫 #include <iostream> #include ...
- UVA 11624 Fire!(两次BFS+记录最小着火时间)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVa 11624,两次BFS
题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...
- UVa 11624 (BFS) Fire!
也是一个走迷宫的问题,不过又有了点变化. 这里迷宫里有若干把火,而且火每秒也是向四个方向蔓延的.问人是否能走出迷宫. 我用了两遍BFS,第一遍把所有着火的格子加入队列,然后计算每个格子着火的时间. 第 ...
随机推荐
- iframs刷新的两种方法
<iframe src="a1.html" id="iframe1Id" name="iframe1Name" width=" ...
- 15 jmeter分布式性能测试
背景由于jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起Java内存溢出的错误.要解决这个问题,可以使用分布式测试,运行多台机器运用所 ...
- mac shell终端编辑命令行快捷键
Ctrl + d 删除一个字符,相当于通常的Delete键(命令行若无所有字符,则相当于exit:处理多行标准输入时也表示eof) Ctrl + h 退格删除一个字符,相当 ...
- Python3之socket编程
一.socket的定义 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后 ...
- [LeetCode] 255. Verify Preorder Sequence in Binary Search Tree_Medium tag: Preorder Traversal, tree
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...
- 自动生产jason的工具
EnjoySR/ESJsonFormat-Xcode
- list的*运算使用过程中遇到的问题
目的: 想生成一个[[],[],[]] 这样的列表, 所以就 [[]]*3 这样做了,但是这样做会有问题,这样list中的三个list其实是同一个list. 例如:a=[[]]*3,然后a[0].ap ...
- css样式表--样式表分类
样式表分类 1.内联式.写在body里.控制精确,可重复性差. <body> <div style="color:#90F">更好发挥的返回结果还 < ...
- 【封装函数】原生js 获取行内外联样式-兼容IE
var dom=document.getElementsByTagName("div")[0]; console.log(getStyle(dom,"padding-to ...
- oracle用户名和密码到期后如何处理
原因:确定是由于Oracle11g中默认在default概要文件中设置了“PASSWORD_LIFE_TIME=180天”所导致. 影响: 1.密码过期后,业务进程连接数据库异常,影响业务使用. 2. ...