UVA11624-Fire!(BFS+预处理)

题目讲述了Joe在着火的迷宫中逃生,需到达边界。通过两次BFS实现,首次预处理火焰传播,记录时间;第二次BFS时,确保Joe避开已蔓延的火焰。难点在于处理多个起火点,使用全局队列管理。
摘要由CSDN通过智能技术生成

题目链接:传送门Biubiubiu~~~

吐槽一下这道题,做题体验极差,在uva转都转不了,在vjudge上也是要么提交失败要么就在队列中不动了,而且这题还挖了大坑,真的是折磨了我几天,打了几次,多少次过了样例就是不知道错哪里mdzz…

分析:题意大概是joe要逃离迷宫,同时迷宫着火,逃离成功的标志是Joe达到任意一条边界,而火焰回向四处燃烧并且持续不断向四周燃烧,这么一看就是两个BFS,然而却不能同时进行。。。。于是就先对火焰进行BFS的预处理,记录下烧到某处时的时间,在下一个Joe的BFS中就只要在对应时间之前错开就行了,这是一坑,第二大坑时题目里还不止一处火焰。。。所以使用全局队列,在有火时就加入队列。

AC代码:

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
char maze[1005][1005];
int times[1005][1005];//火焰到达某处的时间
bool vis[1005][1005];
const int INF=0x3f3f3f3f;//用这个INF就可以memset很奇妙
int d[4][2]={
  {1,0},{-1,0},{0,1},{0,-1}};
int r,c;
int total;//总共的步数
struct node{
	int x,y,step;
};
node J;  //Joe的位置
queue<node>	que;  //全局队列,方便加入火焰队列
void que_clear(){			//记得使用前清空
	while(!q
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值