UVA 11624 BFS的妙用
题意:
迷宫里起火了,有若干个障碍物,有多个起火点,起火点每经过一个时间间隔就向它的上下左右相邻的格子扩散。
有个倒霉的人好像叫做“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的妙用的更多相关文章
- uva 11624(bfs)
11624 - Fire! Time limit: 1.000 seconds Joe works in a maze. Unfortunately, portions of the maze hav ...
- UVa 11624 (BFS) Fire!
也是一个走迷宫的问题,不过又有了点变化. 这里迷宫里有若干把火,而且火每秒也是向四个方向蔓延的.问人是否能走出迷宫. 我用了两遍BFS,第一遍把所有着火的格子加入队列,然后计算每个格子着火的时间. 第 ...
- UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次
UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...
- BFS(两点搜索) UVA 11624 Fire!
题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...
- UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题
很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M): UVA 11624 写的比较挫 #include <iostream> #include ...
- E - Fire! UVA - 11624(bfs + 记录火到达某个位置所需要的最小时间)
E - Fire! UVA - 11624 题目描述 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必 ...
- UVa 11624 Fire!(着火了!)
UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...
- UVa 11624,两次BFS
题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...
- UVA 11624 Fire! bfs 难度:0
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
随机推荐
- scrapy爬虫笔记(三)------写入源文件的爬取
开始爬取网页:(2)写入源文件的爬取 为了使代码易于修改,更清晰高效的爬取网页,我们将代码写入源文件进行爬取. 主要分为以下几个步骤: 一.使用scrapy创建爬虫框架: 二.修改并编写源代码,确定我 ...
- Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B. Batch Sort
链接 题意:输入n,m,表示一个n行m列的矩阵,每一行数字都是1-m,顺序可能是乱的,每一行可以交换任意2个数的位置,并且可以交换任意2列的所有数 问是否可以使每一行严格递增 思路:暴力枚举所有可能的 ...
- Spring和Struts2整合
目的:spring容器管理Action类,代替Servlet 步骤:主要在配置文件 Struts2: 添加支持spring的jar包, 配置<action class="Action类 ...
- [html] 有利于seo优化的div+css命名规范
搜索引擎优化(seo)对命名规范有很多要求,下面是我收集的一些当下主流的命名(还是比较常用的): CSS样式命名 说明 网页公共命名 #wrapper 页面外围控制整体布局宽度 #container或 ...
- 关于div的滚动条滚动到底部,内容显示不全的问题。(已解决)
今天我做了一个带有滚动条,底部有两个按钮的div. 当我拖动滚动条到底部, 按钮没有显示出来. 我看了看我的样式设置,是这样的: /* 内容样式 */ #contentPartDiv{ posit ...
- Git 恢复某个文件指定版本
1. git reflog 找到comit id 2. git reset edf92f a.txt 3. git commit -m "ssss" 4. git checkou ...
- SQL学习整理_2
字符串处理,字符串函数不会改变存储在表中的数据内容,他们只是把函数结果当成查询结果返回. 1. SELECT right(name,2) FROM my_list --从my_list列表中取出n ...
- AngularJS基础知识1
一.angularJS简介 1.什么是 AngularJS? AngularJS 是一个 JavaScript 框架.它是一个以 JavaScript 编写的库.AngularJS是协助搭建单页面工程 ...
- Selenium2学习-041-chromedriver:org.openqa.selenium.WebDriverException: unknown error: cannot determine loading status from unexpected alert open
今天在写WebDriver处理弹出框(alert.confirm.prompt)演示实例脚本分发给朋友时,在其执行时未能成功执行,对应的部分错误详情如下: org.openqa.selenium.We ...
- linq 左连接
var list = (from item in vall join item3 in v1 on new { item.FItemID, item.FAuxPropID } equals new { ...