题意:求这个背着定时炸弹的人如果能走出迷宫最少能走多少步,当然如果不能走出去则输出 “-1”。
思路:就是一个BFS+一个优化的判断(到达时间更新装置点所用的时间越少越好)。
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int t,n,m,map[111][111];
int sx,sy,dx,dy;
int fx[4]= {1,0,-1,0};
int fy[4]= {0,1,0,-1};
struct node
{
int x,y,tim,use;
};
void bfs()
{
queue<node>Q;
node q1,q2;
q1.x=sx,q1.y=sy,q1.tim=6,q1.use=0;
Q.push(q1);
while(!Q.empty())
{
q2=Q.front();
Q.pop();
if(q2.x==dx&&q2.y==dy)
{
cout<<q2.use<<endl;
return ;
}
for(int i=0; i<4; i++)
{
q1.tim=q2.tim-1;
q1.use=q2.use+1;
q1.x=q2.x+fx[i];
q1.y=q2.y+fy[i];
if(map[q1.x][q1.y]&&q1.x>=0&&q1.y<m&&q1.x<n&&q1.y>=0&&q1.tim>0)
{
if(map[q1.x][q1.y]==4)//发现清除装置。
{
q1.tim=6;
map[q1.x][q1.y]=0;
}
Q.push(q1);
}
}
}
cout<<-1<<endl;
return ;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
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)//这是出口
dx=i,dy=j;
}//输入+初始条件.
bfs();
}
return 0;
}