题目链接

题意:帮助joe走出一个大火蔓延的迷宫,其中joe每分钟可往上下左右四个方向之一走,所有着火的格子都会蔓延(空格与着火格有公共边,下一分钟这个空格也会着火)。迷宫中有一些障碍格,joe和火都无法进入,当joe走到一个边界的格子我们认为他走出了迷宫

输出R行C列的迷宫,#表示墙,.表示空地,J表示joe,F是着火格

如果能走出,输出最少时间否则,impossible

分析:不知道怎么处理大火蔓延这个东西,看了书上的方法,太棒了,就是对所以得着火点进行以bfs,就可以求出到蔓延到每一个格子的时间了,然后joe走的时候就看看他到这个格子的时候,时间到没到火蔓延的时候

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int Max = + ;
int fire[Max][Max],g[Max][Max],vis[Max][Max];
int R,C;
int sx, sy;
int gx[] = {, , , -};
int gy[] = {-, , , };
int Time;
struct Node
{
int x,y;
};
queue<Node> Fire;
void solve(int i, int j, char ch)
{
if(ch == '#')
{
g[i][j] = -;
vis[i][j] = INF;
fire[i][j] = INF;
}
else if(ch == '.')
{
g[i][j] = ;
vis[i][j] = INF;
fire[i][j] = INF;
}
else if(ch == 'J')
{
sx = i;
sy = j;
vis[i][j] = ;
fire[i][j] = INF;
}
else if(ch == 'F')
{
fire[i][j] = ;
vis[i][j] = INF;
g[i][j] = ;
Node node;
node.x = i;
node.y = j;
Fire.push(node);
}
}
void fire_bfs() // 对大火蔓延的bfs
{
while(!Fire.empty())
{
Node node = Fire.front();
Fire.pop();
for(int i = ; i < ; i++)
{
int fx = node.x + gx[i];
int fy = node.y + gy[i];
if(fx >= && fx <= R && fy >= && fy <= C && g[fx][fy] != -)
{
if(fire[fx][fy] > fire[node.x][node.y] + )
{
fire[fx][fy] = fire[node.x][node.y] + ;
Node temp;
temp.x = fx;
temp.y = fy;
Fire.push(temp);
}
}
}
}
}
void road_bfs()
{
queue<Node> Road;
Node node;
node.x = sx;
node.y = sy;
Road.push(node);
while(!Road.empty())
{
node = Road.front();
Road.pop();
if(node.x == || node.x == R || node.y == || node.y == C)
{
Time = vis[node.x][node.y];
return;
}
for(int i = ; i < ; i++)
{
int fx = node.x + gx[i];
int fy = node.y + gy[i];
if(fx >= && fy >= && fx <= R && fy <= C && g[fx][fy] != -)
{
if(vis[fx][fy] > vis[node.x][node.y] + && vis[node.x][node.y] + < fire[fx][fy])
{
vis[fx][fy] = vis[node.x][node.y] + ;
Node temp;
temp.x = fx;
temp.y = fy;
Road.push(temp);
}
}
}
}
}
int main(int argc, char** argv)
{
int test;
scanf("%d", &test);
while (test--)
{
while(!Fire.empty())
Fire.pop();
scanf("%d%d", &R, &C);
getchar();
char ch;
for(int i = ; i <= R; i++)
{
for(int j = ; j <= C; j++)
{
scanf("%c", &ch);
solve(i, j, ch);
}
getchar();
}
Time = INF;
fire_bfs();
road_bfs();
if(Time != INF)
printf("%d\n", Time + );
else
printf("IMPOSSIBLE\n"); }
return ;
}

UVA11624Fire!(BFS)的更多相关文章

  1. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  2. 【BZOJ-1656】The Grove 树木 BFS + 射线法

    1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 186  Solved: 118[Su ...

  3. POJ 3278 Catch That Cow(bfs)

    传送门 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 80273   Accepted: 25 ...

  4. POJ 2251 Dungeon Master(3D迷宫 bfs)

    传送门 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 11 ...

  5. Sicily 1215: 脱离地牢(BFS)

    这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而 ...

  6. Sicily 1048: Inverso(BFS)

    题意是给出一个3*3的黑白网格,每点击其中一格就会使某些格子的颜色发生转变,求达到目标状态网格的操作.可用BFS搜索解答,用vector储存每次的操作 #include<bits/stdc++. ...

  7. Sicily 1444: Prime Path(BFS)

    题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ...

  8. Sicily 1051: 魔板(BFS+排重)

    相对1150题来说,这道题的N可能超过10,所以需要进行排重,即相同状态的魔板不要重复压倒队列里,这里我用map储存操作过的状态,也可以用康托编码来储存状态,这样时间缩短为0.03秒.关于康托展开可以 ...

  9. Sicily 1150: 简单魔板(BFS)

    此题可以使用BFS进行解答,使用8位的十进制数来储存魔板的状态,用BFS进行搜索即可 #include <bits/stdc++.h> using namespace std; int o ...

随机推荐

  1. LXC的介绍

    LXC又名Linux container,是一种虚拟化的解决方案,这种是内核级的虚拟化.(主流的解决方案Xen ,KVM, LXC) 介绍 通过namespace进行资源的隔离,Gust1下的进程与G ...

  2. 74 partprobe-磁盘管理

    partprobe命令用于重读分区表,当出现删除文件后,出现仍然占用空间.可以partprobe在不重启的情况下重读分区. 语法 partprobe (选项) (参数) 选项 -d:不更新内核: -s ...

  3. python代码缩进

    习惯了java,c++之类的宽容,初学python,被它摆了道下马威,写if else,竟然必须要我正确用缩进格式,原来在python里不能用括号来表示语句块,也不能用开始/结束标志符来表示,而是靠缩 ...

  4. overlay-1

    .overlay-shadowbox{ visibility:hidden; position:absolute; display:block; margin:0; padding:0; top:0; ...

  5. java String.split()函数的用法分析

    java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...

  6. Swift开发小技巧--扫描二维码,二维码的描边与锁定,设置扫描范围,二维码的生成(高清,无码,你懂得!)

    二维码的扫描,二维码的锁定与描边,二维码的扫描范围,二维码的生成(高清,无码,你懂得!),识别相册中的二维码 扫描二维码用到的三个重要对象的关系,如图: 1.懒加载各种类 // MARK: - 懒加载 ...

  7. 强连通 HDU 3639

    t个样例 n个点 m条边 求有手帕最多的人 A->B B->C C 2块 可以传递 先强联通一下 这里的权是强连通分量中有几个点 然后要建一下反图 入度为0的点就有可能是最大的点 #inc ...

  8. 使用Apache Archiva搭建Maven Repository Server

    关于 Maven 私服 的搭建 这里 采用 Apache Archiva 的 Standanlone 模式来安装 1) 首先到archiva主页上下载最新版(Archiva 2.2.1 Standal ...

  9. 如何破解Excel文档的编辑密码

    对于Excel文档我们不仅可以设置打开密码,还可以设置几天几种密码,比如编辑密码.编辑密码又称写保护密码,是一种可以限制编辑权限的密码.如果我们在日常工作中发现自己忘记了excel编辑密码的话,那就需 ...

  10. .VDI manual Technical Logistics - Volume 2: Industrial Trucks

    VDI manual Technical Logistics - Volume 2: Industrial Trucks Name Publication date: State VDI 2196 B ...