UVA_11624 Fire! 【BFS】
一、题面
略
二、题意分析
一个迷宫中,有一个人Joe和一个或多个起火点,起火点可以蔓延,人可以走动,都只能走4个方向,问人能走出去的最少步数,如果不能输出不可能。很多大佬说是两遍BFS,先一遍火,记录所有火蔓延到次位置的时间,然后再一遍BFS,让Joe去走,只要满足他到该点时,火还未蔓延至此就可以。我一开始就死磕的让火的蔓延与人走同步,但后来发现很多坑!!!后来A了,总结一下,在同步的时候其实需要控制的也是时间,只不过现在的时间是通过控制每次BFS访问的位置的个数来控制的,当Joe在某个时刻可能走的点都访问完后,那么火就蔓延一次,下一次Joe走的时候,要先判断一下,之前入队列的点是否在这一时刻还合法,然后继续访问队列中的其他点,再进行下一层的遍历。最终可得到最终结果。
三、AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 1e3;
int R, C;
bool Maze[MAXN+][MAXN+];
bool visited[MAXN+][MAXN+];
char S[MAXN+];
const int dx[] = {, , , -};
const int dy[] = {, -, , }; struct Point
{
int x, y;
int step;
Point(){};
Point(int a, int b)
{
x = a, y = b;
}
};
queue<Point> FQ;
int BFS(Point J)
{
memset(visited, , sizeof(visited));
queue<Point> JQ;
Point tj , tf, t;
int x, y, Cnt = J.step;
JQ.push(J);
while(!JQ.empty())
{
tj = JQ.front(); if(tj.step > Cnt)
{
Cnt = tj.step;
int L = FQ.size();
for(int i = ; i < L; i++)
{
t = FQ.front();
FQ.pop();
for(int j = ; j < ; j++)
{
x = t.x + dx[j];
y = t.y + dy[j]; if(Maze[x][y] == && x >= && x < R && y >= && y < C)
{ Maze[x][y] = ;
FQ.push(Point(x, y));
}
}
}
}
JQ.pop();
if(Maze[tj.x][tj.y] == )
continue;
for(int i = ; i < ; i++)
{
t.x = tj.x + dx[i];
t.y = tj.y + dy[i];
t.step = tj.step+;
if(t.x < || t.x >= R || t.y < || t.y >= C)
{
return t.step;
}
if(Maze[t.x][t.y] == && visited[t.x][t.y] == )
{
visited[t.x][t.y] = ;
JQ.push(t);
}
}
}
return -;
} int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int T, Ans;
scanf("%d", &T);
int K = ;
while(T--)
{
K++;
memset(Maze, , sizeof(Maze));
while(!FQ.empty())
FQ.pop();
scanf("%d %d", &R, &C);
Point J, F;
for(int i = ; i < R; i++)
{
scanf("%s", S);
for(int j = ; j < C; j++)
{
if(S[j] == '#')
Maze[i][j] = ;
else if(S[j] == '.')
Maze[i][j] = ;
else if(S[j] == 'J')
{
J.x = i, J.y = j;
Maze[i][j] = ;
}
else if(S[j] == 'F')
{
F.x = i, F.y = j;
Maze[i][j] = ;
FQ.push(F);
}
}
}
visited[J.x][J.y] = ;
J.step = ;
Ans = BFS(J);
if(Ans == -)
{
printf("IMPOSSIBLE\n");
}
else
printf("%d\n", Ans);
}
return ;
}
UVA_11624 Fire! 【BFS】的更多相关文章
- UVA - 11624 Fire! 【BFS】
题意 有一个人 有一些火 人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延 求 人能不能跑出来 如果能 求最小时间 思路 有一个 坑点 火是 可能有 多处 的 样例中 只有 ...
- uva 11624 Fire! 【 BFS 】
按白书上说的,先用一次bfs,求出每个点起火的时间 再bfs一次求出是否能够走出迷宫 #include<cstdio> #include<cstring> #include&l ...
- 【bfs】抓住那头牛
[题目] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次 ...
- 【bfs】拯救少林神棍(poj1011)
Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...
- 【bfs】Knight Moves
[题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...
- 【bfs】1252 走迷宫
[题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...
- 【bfs】献给阿尔吉侬的花束
[题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...
- 【bfs】迷宫问题
[题目描述] 定义一个二维数组: int maze[5][5] = { 0,1,0,0,0, 0,1,0,1,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,1,0, }; 它表示一个迷 ...
- 【bfs】仙岛求药
[题目描述] 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处.迷阵由M×N个方格组成,有的 ...
随机推荐
- SpringCloud02 Eureka知识点、Eureka服务端和客户端的创建、Eureka服务端集群、Eureka客户端向集群的Eureka服务端注册
1 Eureka知识点 按照功能划分: Eureka由Eureka服务端和Eureka客户端组成 按照角色划分: Eureka由Eureka Server.Service Provider.Servi ...
- C#连接Mysql数据库 MysqlHelper.cs文件
mysql.data.dll下载_c#连接mysql必要插件mysql.data.dll是C#操作MYSQL的驱动文件,是c#连接mysql必要插件,使c#语言更简洁的操作mysql数据库.当你的电脑 ...
- 面试题: java多线程 背1
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- ibatis和hibernate
ibatis:sql需要自己写hibernate:sql自动生成上面是最大的区别,下面是一些细节.选择Hibernate还是iBATIS都有它的道理:Hibernate的特点:Hibernate功能强 ...
- javascript总结1:js常见页面消息输出方式 alert confirm console prompt document
.1 js常见的输出方法: 1-1 alert 警告框 alert("js语法总结"); 1-2 confirm 确认方法 confirm("js语法总结"); ...
- 注入学习1:SQL注入语句大全
学习背景 之前做了xss预防,以及些许的注入预防了,但是不够全面,如果还是搜集了下一些常用的注入手段,以此用来进行更好的预防. 什么是注入 一般来说,SQL注入一般存在于形如:HTTP://xxx.x ...
- PostgreSQL 速查、备忘手册 | PostgreSQL Quick Find and Tutorial
PostgreSQL 速查.备忘手册 作者:汪嘉霖 这是一个你可能需要的一个备忘手册,此手册方便你快速查询到你需要的常见功能.有时也有一些曾经被使用过的高级功能.如无特殊说明,此手册仅适用于 Linu ...
- JavaScript补充:BOM(浏览器对象模型)
一些公共对象.详细参考手册. 一.Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架(<frame> 或 <iframe> 标签),浏览器会为 H ...
- FileUtils 文件下载 文件导出
public class FileUtils { /// <summary> /// 文件下载 /// </summary> /// <param name=" ...
- Java java.lang.Thread#join()方法分析
结论:A 线程调用 B 线程对象的 join 方法,则 A 线程会被阻塞,直到 B 线程 挂掉 (Java Doc 原话: Watis for this thread to die). 一.分析 查看 ...