Description 旅行者和班尼特一起进入了迷宫冒险,但是由于班尼特的不幸体制,迷宫里发生了大火!
迷宫可以看作是一个二维的地图,范围是n * m (1<=n,m<=50)
初始时旅行者和班尼特在迷宫的点(x,y)位置上
迷宫的出口坐标为(ex,ey)
迷宫的墙的坐标为(ai,bi)
大火的起源为(fx,fy)
大火每秒会向周围八个方向扩散(上下左右、左上、右上、左下、右下)
旅行者和班尼特每秒可以选择一个方向移动一格(上、下、左、右)
对于任意秒数,旅行者和班尼特先移动,而后大火进行扩散。大火可以烧毁墙壁,旅行者和班尼特不能试图踏入大火所在的区域。
如果旅行者和班尼特能逃出迷宫,输出最短逃脱时间,如果不能,输出T_TInput 第一行输入一个整数t,表示一共的测试数据组数。
对于每个测试用例,输入两个整数n,m,表示迷宫的大小。
接下来是六个整数x,y,ex,ey,fx,fy (1<=x,ex,fx<=n,1<=y,ey,fy<=m)
接下来一个整数k,表示有k堵墙。(0<=k<=n*m)然后是k行整数ai,bi,表是在(ai,bi)的位置上有一堵墙。(1<=ai<=n,1<=bi<=m)
Output t行字符,问题的答案
末尾有换行
Sample Input 2
5 5
3 3 4 4 1 1
1
3 4
5 5
2 4 4 5 1 5
5
1 4
2 3
2 5
3 4
3 5Sample Output 2
T_T
我的思路是开一个数组,存储障碍,再开一个数组用dfs将每一个火扩散到每一个位置的时间记录下来,然后再开一个记录自己时间的数组,然后进行dfs,如果不是障碍,不越界,并且自己的时间小于火到的时间,那么就放进去,如果能到那个位置,就输出,否则输出t—t,但是注意这里有一个特判,不难但是很容易漏掉,如果你到达终点,那么你的时间和火的时间重合也是没问题的
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
constexpr int N=35;
int t,n,m,x,y,ex,ey,fx,fy,k,ai,bi;
int za[N][N],huo[N][N],temp1[N][N],sum[N][N],temp3[N][N];
int dx[8]={1,0,0,-1,1,1,-1,-1},dy[8]={0,1,-1,0,1,-1,1,-1};
int bfs1(int x,int y){
queue<pair<int,int >>q;
q.push(make_pair(x,y));
temp1[x][y]=1;
while(!q.empty()){
auto z=q.front();
q.pop();
for(int i=0;i<8;i++ ){
int xx=z.first+dx[i],yy=z.second+dy[i];
if(xx>=1&&y>=1&&xx<=n&&yy<=m&&temp1[xx][yy]==0){
temp1[xx][yy]=1;
huo[xx][yy]=huo[z.first][z.second]+1;
q.push(make_pair(xx,yy));
}
}
}
}
void bfs2(int a1,int b1){
queue<pair<int,int >>que;
que.push(make_pair(a1,b1));
temp3[a1][b1]=1;
while(!que.empty()){
auto w=que.front();
que.pop();
int ans=sum[w.first][w.second]+1;
if(w.first==ex&&w.second==ey){
printf("%d\n",ans-1);
return;
}
for(int i=0;i<4;i++ ){
int aa=w.first+dx[i],bb=w.second+dy[i];
if(aa==ex&&bb==ey&&za[aa][bb]==0&&temp3[aa][bb]==0&&ans<=huo[aa][bb]){
printf("%d\n",ans);
return;
}
if(aa>=1&&bb>=1&&aa<=n&&bb<=m&&za[aa][bb]==0&&temp3[aa][bb]==0&&ans<huo[aa][bb]){
temp3[aa][bb]=1;
que.push(make_pair(aa,bb));
sum[aa][bb]=ans;
}
}
}
printf("T_T\n");
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
scanf("%d%d%d%d%d%d",&x,&y,&ex,&ey,&fx,&fy);
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d%d",&ai,&bi);
za[ai][bi]=1;
}
bfs1(fx,fy);
bfs2(x,y);
memset(za,0,sizeof(za));
memset(temp1,0,sizeof(temp1));
memset(temp3,0,sizeof(temp3));
memset(sum,0,sizeof(sum));
memset(huo,0,sizeof(huo));
}
}