X-man

导航

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;
}

 

 

posted on 2013-09-22 16:12  雨钝风轻  阅读(265)  评论(0编辑  收藏  举报