#include<iostream>
#include<queue>
using namespace std;
int i,j,n,m,flag,tuse,tremain;
int mark[10][10];
int map[10][10];
struct node
{
int x,y,usetime,remaintime;
}start,n1,n2;
void setmap()
{
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]==2)
{
start.x=i;
start.y=j;
start.usetime=0;
start.remaintime=6;
}
}
}
}
void bfs()
{
const int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
memset(mark,0,sizeof(mark));
mark[start.x][start.y]=6;
tuse=0;
tremain=0;
queue<node>q;
while(!q.empty())
q.pop();
q.push(start);
while(!q.empty()&&flag)
{
n2 = q.front();
q.pop();
for(i=0;i<4;i++)
{
n1.x=n2.x+dir[i][0];
n1.y=n2.y+dir[i][1];
if(n1.x>=0&&n1.y>=0&&n1.x<=n-1&&n1.y<=m-1&&map[n1.x][n1.y]!=0)
{
n1.usetime=n2.usetime+1;
n1.remaintime=n2.remaintime-1;
if(map[n1.x][n1.y]==4)
{
n1.remaintime=6;
}
if(map[n1.x][n1.y]==3)
{
tuse=n2.usetime+1;
tremain=n2.remaintime-1;
flag=0;
break;
}
if(n1.remaintime>1&&mark[n1.x][n1.y]<n1.remaintime)
{
mark[n1.x][n1.y]=n1.remaintime;
q.push(n1);
}
}
}
if(!flag)
{
break;
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
setmap();
flag=1;
bfs();
if(!flag)
{
if(tremain>0)
{
cout<<tuse<<endl;
}
else
{
cout<<-1<<endl;
}
}
else
{
cout<<-1<<endl;
}
}
return 0;
}
HDU Nightmare
最新推荐文章于 2024-07-29 14:00:00 发布