CodeForces 589J Cleaner Robot

有一个M*N的矩阵,有一个会自动清洁的机器人,这个机器人会按照设定好的程序来打扫卫生,如果当前方向前面可以行走,那么直接走,如果不可以走那么会向右转动90度,然后回归上一步判断。求机器人最多能打扫的面积是多少

一开始认为是走到之前清扫过的就停止搜索 后来知道是走到一个四个方向都走过的点才停止搜索

#include<stdio.h>
#include<string.h>

const int MAXN = 17;

 ///'U', 'R', 'D' 'L'
int dir[4][2] = { {-1,0},{0,1},{1,0},{0,-1} }; //后面是前面90度
int M, N;
char G[MAXN][MAXN];
bool v[MAXN][MAXN][4];

void DFS(int k, int x, int y, int &ans) //k纪录当前方向
{
    if(G[x][y] == '.')
    {
        ans += 1;
        G[x][y] = '#';
    }

    for(int i=0; i<4; i++)
    {
        int nx = x+dir[(i+k)%4][0];
        int ny = y+dir[(i+k)%4][1];

        if(nx>=0&&nx<M && ny>=0&&ny<N && G[nx][ny]!='*')
        {
            if(v[nx][ny][(i+k)%4] == true)
                break;
            v[nx][ny][(i+k)%4] = true;
            DFS((i+k)%4, nx, ny, ans);
            break;
        }
    }
}

int main()
{
    while(scanf("%d%d", &M, &N) != EOF)
    {
        memset(v, 0, sizeof(v));

        int x, y, op;

        for(int i=0; i<M; i++)
        {
            scanf("%s", G[i]);
            for(int j=0; j<N; j++)
            {
                if(G[i][j] == 'U')
                    op = 0, x=i, y=j;
                if(G[i][j] == 'R')
                    op = 1, x=i, y=j;
                if(G[i][j] == 'D')
                    op = 2, x=i, y=j;
                if(G[i][j] == 'L')
                    op = 3, x=i, y=j;
            }
        }

        int ans = 1;
        DFS(op, x, y, ans);

        printf("%d\n", ans);
    }

    return 0;
}

 

posted @ 2017-07-07 23:09  Aragaki  阅读(193)  评论(0编辑  收藏  举报