https://blog.csdn.net/sxx312/article/details/51762904
/*******************************************
FileName:bfs
Author:苏相学
Date:2016年6月26日15:44:37
Description:功能
Others:
********************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 105;
struct node{
int x,y,time;
}nex,now;
int fx[4]={0,0,1,-1};
int fy[4]={1,-1,0,0};
int map[120][120];
int vis[120][120];
int output[120][120];
int m,n;
void bfs(int x,int y)
{
queue<node> s;
memset(vis,0,sizeof(vis));
memset(output,0,sizeof(output));
vis[x][y]=6;
now.x=x;
now.y=y;
now.time=6;
s.push(now);
while(!s.empty())
{
now=s.front();
s.pop();
for(int i=0;i<4;i++){
nex.x=now.x+fx[i];
nex.y=now.y+fy[i];
nex.time=now.time;
if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m&&vis[nex.x][nex.y]!=nex.time&&map[nex.x][nex.y]!=0)
{
if(map[nex.x][nex.y]==4)
{
nex.time=now.time-1;
if(nex.time==0) continue;
output[nex.x][nex.y]=output[now.x][now.y]+1;
vis[nex.x][nex.y]=nex.time;
nex.time=6;
s.push(nex);
map[nex.x][nex.y]=0;
}
if(map[nex.x][nex.y]==1)
{
output[nex.x][nex.y]=output[now.x][now.y]+1;
nex.time=now.time-1;
vis[nex.x][nex.y]=nex.time;
if(nex.time==0) continue;
s.push(nex);
}
if(map[nex.x][nex.y]==3)
{
nex.time=now.time-1;
if(nex.time==0) continue;
printf("%d\n",output[now.x][now.y]+1);
return ;
}
}
}
}
printf("-1\n");
return ;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
int x,y;
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)
{
x=i;
y=j;
}
}
bfs(x,y);
}
return 0;
}