题意:

迷宫里起火了,有若干个障碍物,有多个起火点,起火点每经过一个时间间隔就向它的上下左右相邻的格子扩散。

有个倒霉的人好像叫做“Joe”,他要逃出来,他每次可以向上下左右任意移动一格,但是即要避开火也要避开障碍物,问你他如果逃得出来的话至少要多少步。

没有着火点的话就直接,bfs了,但是有的话就稍微与处理一下,我们可以通过对着火点bfs,从而知道每个格子在什么时间着火。

这样的话,只要先bfs着火点,把每个格子在什么时间着火保存到数组里;然后bfs那个人,在判断他可不可以那个格子的check函数增加一步,检查他走过去的时间是不是小于起火的时间。

源代码:

 #include <stdio.h>
#include <string.h>
const int maxn=;
const int sizeq=;
bool vis[maxn][maxn];
int fi[maxn][maxn],dis[maxn][maxn];
char map[maxn][maxn];
int dir[][]={{-,},{,},{,-},{,}};
int T,R,C,ans;
bool flag; struct Node{
int x,y;
};
Node q[sizeq];
int font,rear;
void Enqueue(Node x)
{
q[rear++]=x;
if(rear==sizeq) rear=;
}
Node Dequeue()
{
Node z=q[font++];
if(font==sizeq) font=;
return z;
}
bool check(Node nd)
{
return nd.x<||nd.y<||nd.x>=R||nd.y>=C||map[nd.x][nd.y]=='#'||vis[nd.x][nd.y];
}
void fire()
{
Node f,nx;
memset(fi,,sizeof(fi));
memset(vis,,sizeof(vis));
font=rear=;
for(int i=;i<R;i++){
for(int j=;j<C;j++){
if(map[i][j]=='F'){
f.x=i;
f.y=j;
fi[i][j]=;
vis[i][j]=;
Enqueue(f);
}
}
}
while(font!=rear){
f=Dequeue();
for(int i=;i<;i++){
nx.x=f.x+dir[i][];
nx.y=f.y+dir[i][];
if(check(nx))continue;
fi[nx.x][nx.y]=fi[f.x][f.y]+;
vis[nx.x][nx.y]=;
Enqueue(nx);
}
}
} bool safe(Node x,int d)
{
return !check(x) && (fi[x.x][x.y]>d||fi[x.x][x.y]==);
} int bfs()
{
Node u,v;
font=rear=;
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
for(int i=;i<R;i++){
for(int j=;j<C;j++){
if(map[i][j]=='J'){
u.x=i;
u.y=j;
Enqueue(u);
vis[i][j]=;
dis[i][j]=;
}
}
}
while(font!=rear){
u=Dequeue();
if(u.x==||u.x==R-||u.y==||u.y==C-){
return dis[u.x][u.y];
}
for(int i=;i<;i++){
v.x=u.x+dir[i][];
v.y=u.y+dir[i][];
if(!safe(v,dis[u.x][u.y]+))continue;
Enqueue(v);
vis[v.x][v.y]=;
dis[v.x][v.y]=dis[u.x][u.y]+;
}
}
return ;
} int main()
{
scanf("%d",&T);
while(T--){
scanf("%d %d",&R,&C);
for(int i=;i<R;i++)scanf("%s",map[i]);
fire();
ans=bfs();
if(ans){
printf("%d\n",ans);
}else{
puts("IMPOSSIBLE");
}
} }

UVA 11624 BFS的妙用的更多相关文章

  1. uva 11624(bfs)

    11624 - Fire! Time limit: 1.000 seconds Joe works in a maze. Unfortunately, portions of the maze hav ...

  2. UVa 11624 (BFS) Fire!

    也是一个走迷宫的问题,不过又有了点变化. 这里迷宫里有若干把火,而且火每秒也是向四个方向蔓延的.问人是否能走出迷宫. 我用了两遍BFS,第一遍把所有着火的格子加入队列,然后计算每个格子着火的时间. 第 ...

  3. UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次

    UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...

  4. BFS(两点搜索) UVA 11624 Fire!

    题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...

  5. UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题

    很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M): UVA 11624 写的比较挫 #include <iostream> #include ...

  6. E - Fire! UVA - 11624(bfs + 记录火到达某个位置所需要的最小时间)

    E - Fire! UVA - 11624 题目描述 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必 ...

  7. UVa 11624 Fire!(着火了!)

    UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...

  8. UVa 11624,两次BFS

    题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...

  9. UVA 11624 Fire! bfs 难度:0

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

随机推荐

  1. Ubuntu14.04安装微软雅黑字体

    1.首先获得一套“微软雅黑”字体库(自行百度),包含两个文件msyh.ttf(普通)、msyhbd.ttf(加粗);2.在/usr/share/fonts目录下建立一个子目录,例如win,命令如下:  ...

  2. Git 常用命令行

    最近在公司的服务器上安装了Git Sever,开始从SVN转向到Git了,整理了一些在Git常用的命令. 取得Git仓库 初始化一个版本仓库 git initClone远程版本库 git clone ...

  3. LaTex编译错误

    Error Launching Console Application PDFTeXify ... Command Line: gbk2uni.exe "XXX" Startup ...

  4. js事件机制——事件冒泡和捕获

    概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的onclick事件也会被触发.js里称这种事件连续发生的机制为事件冒泡或者事件捕获. IE浏览器:事件从 ...

  5. PHP入门介绍与环境配置

    浏览目录: 一.PHP的背景和优势: 二.PHP原理简介: 三.PHP运行环境配置: 四.编写简单的PHP代码以及测试. 一.PHP的背景和优势 1.1   什么是PHP? PHP是能让你生成动态网页 ...

  6. JSON 与 JSONP

    JSON (JavaScript Object Notation) is a lightweight data-interchange format. 即 JSON 是一种轻量级的数据交换格式. 1. ...

  7. centos6.5新增加硬盘挂载并实现开机时自动挂载

    在内网主机新增一个2T硬盘,先关机断电再连接硬盘数据线和电源线! 查看当前磁盘设备信息: [root@tb ~]# fdisk -lWARNING: GPT (GUID Partition Table ...

  8. 关于iPhone设备不同显示尺寸适配的一些方法

    关于iPhone设备不同显示尺寸适配的一些方法   ------关于适配的理解------ 1.什么是适配? 适配是对不同硬件和系统软件的适应,硬件包括屏幕显示,处理器,内存等等(目前主要是屏幕适配, ...

  9. Unity5和WebGL移植指南的一些总结

    对于手游开发者来说,更新版本往往意味着非常复杂的过程,你需要根据反馈做更新.测试.提交然后等待审核,而由于不需要客户端依赖,页游往往是快速测试游戏版本的最佳途径,很多人可能都知道Unity 5可以再不 ...

  10. PyInstaller打包步骤简记

    pyinstaller 下载地址:http://www.pyinstaller.org/ 下载后用cmd进入解压文件夹 python setup.py install 安装. 最近用pyinstall ...