题目链接:传送门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(!que.empty()){
que.pop();
}
}
bool check(int x,int y){ //判断是否越界
if(x>=0&&x<r&&y>=0&&y<c) return true;
else retur