Thursday, April 28, 2011

11352 - Crazy King


#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.