一、题面

二、题意分析

一个迷宫中,有一个人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】的更多相关文章

  1. UVA - 11624 Fire! 【BFS】

    题意 有一个人 有一些火 人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延 求 人能不能跑出来 如果能 求最小时间 思路 有一个 坑点 火是 可能有 多处 的 样例中 只有 ...

  2. uva 11624 Fire! 【 BFS 】

    按白书上说的,先用一次bfs,求出每个点起火的时间 再bfs一次求出是否能够走出迷宫 #include<cstdio> #include<cstring> #include&l ...

  3. 【bfs】抓住那头牛

    [题目] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次 ...

  4. 【bfs】拯救少林神棍(poj1011)

    Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...

  5. 【bfs】Knight Moves

    [题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...

  6. 【bfs】1252 走迷宫

    [题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...

  7. 【bfs】献给阿尔吉侬的花束

    [题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...

  8. 【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, }; 它表示一个迷 ...

  9. 【bfs】仙岛求药

    [题目描述] 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处.迷阵由M×N个方格组成,有的 ...

随机推荐

  1. Windows下Memcached的安装配置方法

    1.将第一个包解压放某个盘下面,比如在c:\memcached. 2.在终端(也即cmd命令界面)下输入 'c:\memcached\memcached.exe -d install' 安装. 3.再 ...

  2. 【转】浏览器中F5和CTRL F5的行为区别

    原文地址:http://www.cnblogs.com/jiji262/p/3410518.html 前言 在印象中,浏览器中的F5和刷新按钮是一样的效果,都是对当前页面进行刷新:Ctrl-F5的行为 ...

  3. 关于box-sizing属性

    写在前面 文中错误或不足之处欢迎指正批评,共同交流! 在项目中写css组件时遇到一个问题: 要求两个按钮均分其父元素宽度,且父元素宽度不固定,像这样: 第一反应很自然的想到使用flex布局,但是由于需 ...

  4. Luogu 3206 [HNOI2010]城市建设

    BZOJ 2001 很神仙的cdq分治 先放论文的链接   顾昱洲_浅谈一类分治算法 我们考虑分治询问,用$solve(l, r)$表示询问编号在$[l, r]$时的情况,那么当$l == r$的时候 ...

  5. 数据库连接池DBUtils

    安装 pip3 install DBUtils DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法, ...

  6. oracle获取表和列的备注

    using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Runti ...

  7. Part10-C语言环境初始化-C与汇编混合编程lesson4

    1.为什么要混合编程 汇编语言:执行效率高:编写繁琐: 执行效率高:能够更直接地控制处理器. c语言:可读性强,移植性好,调试方便. 1.汇编调用c函数 2.c调用汇编函数 汇编语言定义的函数(标号) ...

  8. 快速入手Web幻灯片制作

    在线幻灯片 使用markdown可以快速的写出优美的文档,接下来我介绍一些简单的语法,快速的用浏览器制作幻灯片. 最基本使用格式 <!DOCTYPE html> <html> ...

  9. Sql--IDENTITY()自动增长列

    CREATE TABLE Tables( , ) ,) NOT NULL, [UpdateTime] [datetime] NOT NULL, CONSTRAINT [PK_Tables] PRIMA ...

  10. iOS wkwebview https 加载不受信用的站点

    iOS 9.0以上直接设置WKNavigationDelegate代理 func webView(_ webView: WKWebView, didReceive challenge: URLAuth ...