题目

源地址:

http://codeforces.com/problemset/problem/8/B

理解

在那遥远的地方有位好姑娘 ,人们走过她的帐篷都要留恋的张望 23333,不逗比了,真正的题解开始。 在一个无穷大的平面上,有一个机器人可以自由地上下左右移动。然后在它移动的路径上,你可以给它设置任意个障碍。如果存在一种障碍的设计,使得机器人的移动路径是最短路径,则OK;如果不存在,则存在BUG。 这道题写得很逗= =。一开始作死用switch来写,不过在字符的判断上好像写搓了,怎么写都是BUG。后来想到可以用一个vis来标记机器人走过的路径,如果存在一个点被访问过两次,那么这个路径一定不是最短路径。不过这份代码挂了,原因是还存在另外一种可能,比如:URD。也就是说,只要形成一个类似于U的结构,也一定不是最短路径。一时半会儿没想出来什么高效的方案,干脆暴力敲了一个。设一个flag出来,然后每走一个点,就四个方向判断一下是否访问过,如果flag>=2,说明一定是BUG。 多亏了CF机子好,居然过了,也是RP好。

代码


#define MAXN 100+10

char road[MAXN];
int vis[2*MAXN][2*MAXN];
int x=105,y=105,len;

bool solve()
{
    for(int i=0; i<len; i++)
    {
        if(road[i]=='L')
        {
            x-=1;
            if(vis[x][y]==1)    return false;
            int flag=0;
            if(vis[x-1][y]) flag++;
            if(vis[x+1][y]) flag++;
            if(vis[x][y+1]) flag++;
            if(vis[x][y-1]) flag++;
            if(flag>=2) return false;
            vis[x][y]=1;
        }
        else if(road[i]=='U')
        {
            y+=1;
            if(vis[x][y]==1)    return false;
            int flag=0;
            if(vis[x-1][y]) flag++;
            if(vis[x+1][y]) flag++;
            if(vis[x][y+1]) flag++;
            if(vis[x][y-1]) flag++;
            if(flag>=2) return false;
            vis[x][y]=1;
        }
        else if(road[i]=='R')
        {
            x+=1;
            if(vis[x][y]==1)    return false;
            int flag=0;
            if(vis[x-1][y]) flag++;
            if(vis[x+1][y]) flag++;
            if(vis[x][y+1]) flag++;
            if(vis[x][y-1]) flag++;
            if(flag>=2) return false;
            vis[x][y]=1;
        }
        else
        {
            y-=1;
            if(vis[x][y]==1)    return false;
            int flag=0;
            if(vis[x-1][y]) flag++;
            if(vis[x+1][y]) flag++;
            if(vis[x][y+1]) flag++;
            if(vis[x][y-1]) flag++;
            if(flag>=2) return false;
            vis[x][y]=1;
        }
    }
    return true;
}

int main(int argc, char const *argv[])
{
    memset(vis,0,sizeof(vis));
    scanf("%s", road);
    len=strlen(road);
    vis[x][y]=1;
    if(solve()) printf("OK\n");
    else printf("BUG\n");
    return 0;
}

更新日志

  • 2014年11月16日 已AC。