#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int M,N;
int next1[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};
int next2[8][2]={{-1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1}};
char Board[105][105];
int BFS(int,int);
void FindID(char,int&,int&);
int main()
{
int t,i,x,y,n;
freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%d%d\n",&M,&N);
for(i=0;i<M;i++)
gets(Board[i]);
FindID('A',x,y);
n = BFS(x,y);
if(n<0)
printf("King Peter, you can't go now!\n");
else
printf("Minimal possible length of a trip is %d\n",n);
}
return 0;
}
void FindID(char ch,int& x,int& y)
{
int i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(Board[i][j]=='A')
{
x=i,y=j;
return;
}
}
int BFS(int sx,int sy)
{
int x,y,i,j,k,tx,ty,d[105][105];
queue<int>Q;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(Board[i][j]=='Z')
{
Board[i][j]='X';
for(k=0;k<8;k++)
{
tx = i + next2[k][0];
ty = j + next2[k][1];
if(tx>=0 && tx<M && ty>=0 && ty<N && Board[tx][ty]!='B' && Board[tx][ty]!='Z')
Board[tx][ty]='X';
}
}
Q.push(sx);Q.push(sy);
Board[sx][sy]='X';
d[sx][sy]=0;
while(!Q.empty())
{
x=Q.front();Q.pop();
y=Q.front();Q.pop();
for(i=0;i<8;i++)
{
tx=x+next1[i][0];
ty=y+next1[i][1];
if(tx>=0&&tx<M&&ty>=0&&ty<N&&Board[tx][ty]!='X')
{
d[tx][ty]=d[x][y]+1;
if(Board[tx][ty]=='B')return d[tx][ty];
Board[tx][ty]='X';
Q.push(tx);
Q.push(ty);
}
}
}
return -1;
}
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.