这真的是几乎很标准的bfs迷宫题了。一点注意,可能一直可以重置时间,但是始终在里面循环无法出来,这种情况应该返回-1,我们需要避免这种情况,因为到达一个重置的地方,剩余步数是一样的,所以再次到这个位置无论如何都不会比第一次到更快的走出迷宫,所以第一次到达重置的位置后,将这个位置加入队列,然后将这个位置置0保证不再经过。
#include<iostream>
#include<queue>
using namespace std;
int map[10][10];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int n,m;
struct node
{
int x;
int y;
int time;
int sum;
};
int bfs(int sx,int sy,int ex,int ey)
{
queue<node>q;
node a;
a.x=sx;
a.y=sy;
a.time=6;
a.sum=0;
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
if(a.x==ex&&a.y==ey) return a.sum;
node t;
for(int i=0;i<4;i++)
{
t.x=a.x+dir[i][0];
t.y=a.y+dir[i][1];
t.time=a.time-1;
t.sum=a.sum+1;
if(t.x<0||t.x>=n) continue;
if(t.y<0||t.y>=m) continue;
if(t.time<=0) continue;
if(map[t.x][t.y]==0) continue;
if(map[t.x][t.y]==4) {t.time=6,map[t.x][t.y]=0;}
q.push(t);
}
}
return -1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
int sx,sy,ex,ey;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]==2)
{
sx=i;
sy=j;
}
if(map[i][j]==3)
{
ex=i;
ey=j;
}
}
}
cout<<bfs(sx,sy,ex,ey)<<endl;
}
}