题意:有一个清洁机器人,他有三种操作 第一种:打扫当前单元, 第二种是按着当前机器人的方向走一格然后回到第一种操作, 第三种是机器人的方向按着顺时针转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;
}