这个题属于BFS,最麻烦的在于其中为4的地方可以恢复时间,去重的时候按最优选择即可,即以得到剩余逃生时间更多作为更优状态进行去重即可。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int x;
int y;
int t;
int ans;
};
const int maxn=10;
int n,m,sx,sy,map[maxn][maxn],movex[4]={0,0,-1,1},movey[4]={1,-1,0,0};
int vis[maxn][maxn];
queue<node> q;
void BFS()
{
while(!q.empty())
q.pop();
q.push((node){sx,sy,6,0});
vis[sx][sy]=1;
while(!q.empty())
{
node v=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int itx=v.x+movex[i];
int ity=v.y+movey[i];
if(map[itx][ity]==0)
continue;
if(map[itx][ity]==3)
{
printf("%d\n",v.ans+1);
return;
}
int time=v.t-1;
if(map[itx][ity]==4)
time=6;
if(time>1&&vis[itx][ity]<time)
{
vis[itx][ity]=time;
q.push((node){itx,ity,time,v.ans+1});
}
}
}
printf("-1\n");
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
vis[i][j]=0;
if(map[i][j]==2)
{
sx=i;
sy=j;
}
}
BFS();
}
return 0;
}