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个方格组成,有的 ...
随机推荐
- Java IO简介
-------------siwuxie095 Java IO简介: IO 也写作"I/O",可理解为 In 和 Out,即 输入 与 输出 ...
- 在CenOS7.5里安装Redis
一.系统环境 操作系统:CentOS 7.5 Redis版本:redis3.2.8 登录账号:Frank 二.安装过程 A.预安装,安装gcc 1.进入终端,切换到root账号 2.输入指令: yum ...
- [GO]工程管理
同级目录: 1.分文件编程,多个源文件,必须放在src目录 2.设置GOPATH目录,目录地址不包括src后缀 3.同一个目录,包名必须一样 4.go env查看go相关的环境路径 5.同一个目录,调 ...
- ajax data参数
表单 使用serializeArray获取所有: <form id='addForm' action='UserAdd.action' type='post'> <label for ...
- logback 常用参数配置详解
logback 常用配置详解(二) <appender> <appender>: <appender>是<configuration>的子节点,是负责写 ...
- 【转】快速开发移动医疗App!开源框架mHealthDroid
原文地址:http://www.csdn.net/article/2014-12-12/2823096-mHealhDroid mHealthDroid是一款开源的移动框架,主要用于帮助开发者快速而又 ...
- c# 锁的使用
1 互斥锁lock(基于Monitor实现) 定义: private static readonly object Lock = new object(); 使用: lock (Lock) { //t ...
- 汇编工具安装一:MASM32的安装!
MASM32是一款汇编开发工具,网址:http://www.masm32.com/ ,它是集合了很多开发汇编程序的工具,windows下汇编程序的开发,很多人都在使用它. 直接下载:http://we ...
- D:大整数的加减乘除
描述 给出两个正整数以及四则运算操作符(+ - * /),求运算结果. 输入第一行:正整数a,长度不超过100第二行:四则运算符o,o是“+”,“-”,“*”,“/”中的某一个第三行:正整数b,长度不 ...
- javascript常用函数(find、filter、map)
1.find 查询数组中符合条件的第一个元素,如果没有符合条件的元素则返回空数组var arr = [1,2,3,4,5,6,7];var dogs=arr.find(v=>v===4);结果: ...