/*
题意:给出t组数据,每组数据n,m代表n行m列0代表墙,1代表路,2代表初始位置,3代表目的地,
4代表复位,人没走一步,需一秒,炸弹初始值有6秒,如果达到复位时炸弹的刚好为0不能复位,
达到出口位置,炸弹剩余位置干好位置为0也不行
思路:因为可以往回走,所以不能只是标记走过没有,应该标记走到的时间,如果这一次走到该位置的时间
大于上一次的时间,才有可能走到目的地否则就不用再走一遍了
*/
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int Map[10][10],Map1[10][10],bu[4][2]= {0,1,0,-1,1,0,-1,0},n,m;
struct node
{
int x,y,temp,time;
node()
{
temp=0;
time=6;
}
}S;
queue<node> v;
int bfs()
{
int i;
while(!v.empty())
v.pop();
node l,r;
Map1[S.x][S.y]=6;
v.push(S);
while(!v.empty())
{
l=v.front();
v.pop();
if(l.time<=1)
continue;
for(i=0; i<4; i++)
{
int aa=l.x+bu[i][0];
int bb=l.y+bu[i][1];
if(aa<0||aa>=n||bb<0||bb>=m||Map[aa][bb]==0)
continue;
r.x=aa;
r.y=bb;
r.temp=l.temp+1;
r.time=l.time-1;
if(Map[aa][bb]==3)
{
return r.temp;
}
else if(Map[aa][bb]==4&&Map1[aa][bb]==0)//虽然题上说4可以无限次到达但是第一次到达后
{//不能到达目的地的话往后也不会再有到达目的地的机会,所以往后就不用再把4入队了
Map1[aa][bb]=1;
r.time=6;
v.push(r);
}
if(Map1[aa][bb]<r.time)
{
Map1[aa][bb]=r.time;
v.push(r);
}
}
}
return -1;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
memset(Map1,0,sizeof(Map1));
scanf("%d%d",&n,&m);
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
scanf("%d",&Map[i][j]);
if(Map[i][j]==2)
{
S.x=i;
S.y=j;
}
}
}
int aa=bfs();
printf("%d\n",aa);
}
return 0;
}
题意:给出t组数据,每组数据n,m代表n行m列0代表墙,1代表路,2代表初始位置,3代表目的地,
4代表复位,人没走一步,需一秒,炸弹初始值有6秒,如果达到复位时炸弹的刚好为0不能复位,
达到出口位置,炸弹剩余位置干好位置为0也不行
思路:因为可以往回走,所以不能只是标记走过没有,应该标记走到的时间,如果这一次走到该位置的时间
大于上一次的时间,才有可能走到目的地否则就不用再走一遍了
*/
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int Map[10][10],Map1[10][10],bu[4][2]= {0,1,0,-1,1,0,-1,0},n,m;
struct node
{
int x,y,temp,time;
node()
{
temp=0;
time=6;
}
}S;
queue<node> v;
int bfs()
{
int i;
while(!v.empty())
v.pop();
node l,r;
Map1[S.x][S.y]=6;
v.push(S);
while(!v.empty())
{
l=v.front();
v.pop();
if(l.time<=1)
continue;
for(i=0; i<4; i++)
{
int aa=l.x+bu[i][0];
int bb=l.y+bu[i][1];
if(aa<0||aa>=n||bb<0||bb>=m||Map[aa][bb]==0)
continue;
r.x=aa;
r.y=bb;
r.temp=l.temp+1;
r.time=l.time-1;
if(Map[aa][bb]==3)
{
return r.temp;
}
else if(Map[aa][bb]==4&&Map1[aa][bb]==0)//虽然题上说4可以无限次到达但是第一次到达后
{//不能到达目的地的话往后也不会再有到达目的地的机会,所以往后就不用再把4入队了
Map1[aa][bb]=1;
r.time=6;
v.push(r);
}
if(Map1[aa][bb]<r.time)
{
Map1[aa][bb]=r.time;
v.push(r);
}
}
}
return -1;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
memset(Map1,0,sizeof(Map1));
scanf("%d%d",&n,&m);
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
scanf("%d",&Map[i][j]);
if(Map[i][j]==2)
{
S.x=i;
S.y=j;
}
}
}
int aa=bfs();
printf("%d\n",aa);
}
return 0;
}