hdu 4740 The Donkey of Gui Zhou

1.扯犊子超多if else 判断的代码,华丽丽的TLE。

#include<stdio.h>

#include<string.h>

#define N 1010

int map[N][N];

int f[4][2]= {0,1,1,0,0,-1,-1,0};

struct Node

{

    int x,y;

    int f;

};

int main()

{

    int n;

    Node tig,don;

    while(scanf("%d",&n)!=EOF&&n)

    {

        memset(map,0,sizeof(map));

        scanf("%d %d %d",&don.x,&don.y,&don.f);

        map[don.x][don.y]=-1;

        scanf("%d %d %d",&tig.x,&tig.y,&tig.f);

        map[tig.x][tig.y]=-2;

        int flag1=1,flag2=1;

        while(flag1||flag2)

        {

            //printf("#%d %d\n",don.x,don.y);

            //printf("$%d %d\n",tig.x,tig.y);

            if(don.x==tig.x&&don.y==tig.y)

            {

                printf("%d %d\n",don.x,don.y);

                break;

            }

            if(flag1)

            {

                int x=don.x+f[don.f][0];

                int y=don.y+f[don.f][1];

                //printf("$%d %d\n",x,y);

                if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-1&&map[x][y]!=-3)

                {

                    //printf("sdafj\n");

                    don.x=x;

                    don.y=y;

                }

                else if(y>=n)

                {

                    x+=1;

                    if(x>=0&&x<n&&map[x][don.y]!=-1&&map[x][don.y]!=-3)don.x=x;

                    else flag1=0;

                    don.f=1;

                }

                else if(x<0)

                {

                    y+=1;

                    if(y>=0&&y<n&&map[don.x][y]!=-1&&map[don.x][y]!=-3)don.y=y;

                    else flag1=0;

                    don.f=0;

                }

                else if(y<0)

                {

                    x-=1;

                    if(x>=0&&x<n&&map[x][don.y]!=-1&&map[x][don.y]!=-3)don.x=x;

                    else flag1=0;

                    don.f=3;

                }

                else if(x>=n)

                {

                    y-=1;

                    if(y>=0&&y<n&&map[don.x][y]!=-1&&map[don.x][y]!=-3)don.y=y;

                    else flag1=0;

                    don.f=2;

                }

                //else flag1=0;

                if(!map[don.x][don.y])map[don.x][don.y]=-1;

                else if(map[don.x][don.x]==-2)map[don.x][don.y]=-3;

            }

            if(flag2)

            {

                int x=tig.x+f[tig.f][0];

                int y=tig.y+f[tig.f][1];

                //printf();

                if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-2&&map[x][y]!=-3)

                {

                    tig.x=x;

                    tig.y=y;

                }

                else if(y>=n)

                {

                    x-=1;

                    if(x>=0&&x<n&&map[x][tig.y]!=-2&&map[x][tig.y]!=-3)tig.x=x;

                    else flag2=0;

                    tig.f=3;

                }

                else if(x<0)

                {

                    y-=1;

                    if(y>=0&&y<n&&map[tig.x][y]!=-2&&map[tig.x][y]!=-3)tig.y=y;

                    else flag2=0;

                    tig.f=2;

                }

                else if(y<0)

                {

                    x+=1;

                    if(x>=0&&x<n&&map[x][tig.y]!=-2&&map[x][tig.y]!=-3)tig.x=x;

                    else flag2=0;

                    tig.f=1;

                }

                else if(x>=n)

                {

                    y+=1;

                    if(y>=0&&y<n&&map[tig.x][y]!=-2&&map[tig.x][y]!=-3)tig.y=y;

                    else flag2=0;

                    tig.f=0;

                }

                //else flag2=0;

                if(!map[tig.x][tig.y])map[tig.x][tig.y]=-2;

                else if(map[tig.x][tig.y]==-1)map[tig.x][tig.y]=-3;

            }

        }



        if(!flag1&&!flag2)printf("-1\n");

    }

    return 0;

}
View Code

 2.思路:

1.如果donkey和tiger能按指定路线行走,判断是否同时到达同意地点

2.如果不能继续行走(遇到自己以前走过的或墙壁),则转弯。

   donkey向右转,tiger向左转,转后仍不能前进,则停下。

3.一个停下,另一个可以继续,直到都停下或同时到达同意地点。

不知道哪里错了(WA)

#include<stdio.h>

#include<string.h>

#define N 1100

int map[N][N];

int f[4][2]= {0,1,1,0,0,-1,-1,0};

struct Node

{

    int x,y;

    int f;

};

int main()

{

    int n;



    while(scanf("%d",&n)!=EOF&&n)

    {

        Node tig,don;

        memset(map,0,sizeof(map));

        scanf("%d %d %d",&don.x,&don.y,&don.f);

        map[don.x][don.y]=-1;

        scanf("%d %d %d",&tig.x,&tig.y,&tig.f);

        map[tig.x][tig.y]=-2;

        int flag1=1,flag2=1;

        while(flag1||flag2)

        {

            //printf("#%d %d\n",don.x,don.y);

            //printf("$%d %d\n",tig.x,tig.y);

            if(don.x==tig.x&&don.y==tig.y)

            {

                printf("%d %d\n",don.x,don.y);

                break;

            }

            if(flag1)

            {

                int x=don.x+f[don.f][0];

                int y=don.y+f[don.f][1];

                //printf("$%d %d\n",x,y);

                if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-1&&map[x][y]!=-3)

                {

                    //printf("sdafj\n");

                    don.x=x;

                    don.y=y;

                }

                else//换方向

                {

                    if(don.f==3)

                        don.f=0;

                    else

                        don.f++;

                    x=don.x+f[don.f][0];

                    y=don.y+f[don.f][1];

                    if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-1&&map[x][y]!=-3)

                    {

                        don.x=x;

                        don.y=y;

                    }

                    else flag1=0;

                }

                if(flag1)

                    if(!map[don.x][don.y])map[don.x][don.y]=-1;

                    else if(map[don.x][don.x]==-2)map[don.x][don.y]=-3;

            }

            if(flag2)

            {

                int x=tig.x+f[tig.f][0];

                int y=tig.y+f[tig.f][1];

                //printf();

                if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-2&&map[x][y]!=-3)

                {

                    tig.x=x;

                    tig.y=y;

                }

                else

                {

                    if(!tig.f)

                        tig.f=3;

                    else tig.f--;

                    x=tig.x+f[tig.f][0];

                    y=tig.y+f[tig.f][1];

                    if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-2&&map[x][y]!=-3)

                    {

                        tig.x=x;

                        tig.y=y;

                    }

                    else flag2=0;

                }

                if(flag2)

                    if(!map[tig.x][tig.y])map[tig.x][tig.y]=-2;

                    else if(map[tig.x][tig.y]==-1)map[tig.x][tig.y]=-3;

            }

        }

        if(!flag1&&!flag2)printf("-1\n");

    }

    return 0;

}

 

 

你可能感兴趣的:(HDU)