Saturday, May 28, 2011

11906 - Knight in a War Grid


#include<stdio.h>
#include<string.h>
#define M 105

int Board[M][M];
int R,C,X,Y,next[8][2],A[8],B[8];
void DFS(int,int);

int main()
{
    int t,i,k,m,n,x,y,w;
    //freopen("in.txt","r",stdin);
    scanf("%d",&t);

    for(k=1;k<=t;k++)
    {
        scanf("%d%d%d%d",&R,&C,&m,&n);

        next[0][0] = -n; next[0][1] =  m;
        next[1][0] = -m; next[1][1] =  n;
        next[2][0] = -m; next[2][1] = -n;
        next[3][0] = -n; next[3][1] = -m;
        next[4][0] =  n; next[4][1] = -m;
        next[5][0] =  m; next[5][1] = -n;
        next[6][0] =  m; next[6][1] =  n;
        next[7][0] =  n; next[7][1] =  m;


        memset(Board,0,sizeof(Board));

        scanf("%d",&w);
        for(i=0;i<w;i++)
        {
            scanf("%d%d",&x,&y);
            Board[x][y] = -1;
        }

        X = Y = x = y = 0;
        DFS(x,y);

        printf("Case %d: %d %d\n",k,X,Y);

        memset(Board,0,sizeof(Board));
    }
    return 0;
}

void DFS(int x,int y)
{
    int nx,ny,tx,ty,i,j,flag,t=0;
    Board[x][y]= 1;
   
    for(i=0; i<8; i++)
    {
        nx = x + next[i][0];
        ny = y + next[i][1];
       
        if(nx>=0 && nx<R && ny>=0 && ny<C && Board[nx][ny]!=-1)
        {
            flag = 0;
            for(j=0; j<i; j++)
            {
                tx = x + next[j][0];
                ty = y + next[j][1];
               
                if(tx==nx && ty==ny)
                {
                    flag = 1; break;
                }
            }
            if(!flag)t++;
            if(Board[nx][ny]==0)
                DFS(nx,ny);
        }   
    }
    if(t&1)
        Y++;
    else
        X++;
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.