这题是个一般的bfs
思路如下:
每走一步减一秒炸弹时间,当时间为1 的时候就不能走了,然后第一次到达终点并且时间不为零的时候结束
注意事项:
1注意标记路,否则有可能在两个炸弹复位装置出来回走
2 终点有可能多次到达,并且后到的时间剩余较多,如下面这个数据
2 1 1 1 1 3
0 0 0 4 0 0
代码如下:
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
int m,n,map[10][10],visit[10][10],time[10][10],sx,sy,ex,ey;
struct node{
int x;
int y;
};
void bfs(){
queue<node>q;
while(!q.empty())q.pop();
node d,D;
d.x=sx;d.y=sy;
q.push(d);
visit[d.x][d.y]=6;
int move[4][2]={0,1, 1,0, 0,-1, -1,0};
while(!q.empty()){
d=q.front();
q.pop();
for(int i=0;i<4;i++){
D.x=d.x+move[i][0];
D.y=d.y+move[i][1];
if(visit[D.x][D.y]<visit[d.x][d.y]-1 && visit[d.x][d.y]-1 && D.x>=1 && D.y>=1 && D.x<=n && D.y<=m && map[D.x][D.y]!=0){
visit[D.x][D.y]=visit[d.x][d.y]-1;
time[D.x][D.y]=time[d.x][d.y]+1;
//cout<<D.x<<" "<<D.y<<" "<<time[D.x][D.y]<<" "<<map[D.x][D.y]<<endl;
if(map[D.x][D.y]==4){
visit[D.x][D.y]=6;
}
q.push(D);
if(time[ex][ey]>0)return ;
}
}
}
}
int main(){
int test;
cin>>test;
while(test--){
memset(map,0,sizeof(map));
memset(visit,0,sizeof(visit));
memset(time,0,sizeof(time));
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;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;
}
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<map[i][j]<<" ";
}
cout<<endl;
} */
bfs();
if(!time[ex][ey])cout<<"-1\n";
else cout<<time[ex][ey]<<endl;
}
}