codeforces 589J

来源:互联网 发布:mysql和oracle的区别 编辑:程序博客网 时间:2024/05/23 19:18

题意:有一个清洁机器人,他有三种操作  第一种:打扫当前单元, 第二种是按着当前机器人的方向走一格然后回到第一种操作, 第三种是机器人的方向按着顺时针转90度然后回到第二步,问最终能清洁多少个单元。

思路:刚开始又理解错题意, 因为转一次之后如果不能走就不能继续走下去了, 其实是可以的, 定义一个vis[i][j][d]  表示机器人是否在 i 行 j 列 方向为 d 的时候访问过, 如果访问过那么它就会走重复的路径, 这个时候就可以结束搜索了。

#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>#include<queue>using namespace std;const int qq = 12;char gra[qq][qq];int vis[qq][qq][5];int n,m;char c[105];int k = 1;void dfs(int x, int y, int dir){int xx,yy;int cnt = 4;while(cnt--){if(dir==0)xx=x-1,yy=y;else if(dir==1)xx=x,yy=y+1;else if(dir==2)xx=x+1, yy=y;else xx=x,yy=y-1;if(gra[xx][yy]=='.'&&!(xx<0||yy<0||xx>=n||yy>=m))break;dir = (dir+1)%4;}if(!(gra[xx][yy]=='.'&&!(xx<0||yy<0||xx>=n||yy>=m)))return;if(vis[xx][yy][dir])return;int flag = 1;for(int i=0; i<4; ++i)if(vis[xx][yy][i])flag=0;if(flag)k++;vis[xx][yy][dir] = 1;dfs(xx, yy, dir);}int main(){memset(vis, 0, sizeof(vis));scanf("%d%d", &n, &m);for(int i=0; i<n; ++i)scanf("%s", gra[i]);int x,y;c['U'] = 0;c['R'] = 1;c['D'] = 2;c['L'] = 3;int dir;for(int j,i=0; i<n; ++i)for(j=0; j<m; ++j){if(gra[i][j]!='*'&&gra[i][j]!='.'){x = i, y = j;dir = c[gra[i][j]];}}vis[x][y][dir] = 1;gra[x][y] = '.';dfs(x, y, dir);printf("%d\n", k);return 0;}


0 0