这道题一开始我题意理解不清楚,匆忙做了,却卡在样例三,这里记录一下这道题,卡了挺久。
题目大意:一个清洁机器人打扫房间,从某个地方开始清扫,当遇到障碍物或超出边界时,顺时针旋转继续清扫,一开始给出一个图,图中标了’U‘、’R‘、’D‘、’L‘的就是开始点,附链接:http://codeforces.com/problemset/problem/589/J。
大体思路:可能做过类似题目的人都会有固定思维,访问过的地方就不再访问,尤其在看这道题时没理解清楚时。这道题的特别之处在于它一个地方不可以访问四次以上,如果超过四次,循环就可以结束了。具体实现代码注释得比较明白。
以下是ac代码:
#include<bits/stdc++.h>
using namespace std;
int w,h;
const int maxn=15;
char box[maxn][maxn];
int vis[maxn][maxn]; //记录一个地方的访问次数
int main(){
memset(vis,0,sizeof(vis));
cin>>w>>h;
int bx,by;
queue<char> q;
for(int i=0;i<w;i++)
for(int j=0;j<h;j++){
cin>>box[i][j];
if(box[i][j]!='.'&&box[i][j]!='*'){
bx=i;
by=j;
}
}
q.push(box[bx][by]); //起始点的走向入队列
char temp;
int x,y; //记录当前位置
int cnt=0; //记录在原地旋转次数
int num=1;
while(!q.empty()&&cnt<=4){ //原地旋转次数超过4它被墙包围了或房间大小就那么大(只有1的大小)
temp=q.front();
q.pop();
if(temp=='U'){
x=bx-1;
y=by;
}
else if(temp=='D'){
x=bx+1;
y=by;
}
else if(temp=='L'){
x=bx;
y=by-1;
}
else if(temp=='R'){
x=bx;
y=by+1;
}
if(x>=0&&x<w&&y>=0&&y<h){
if(box[x][y]!='*'){
cnt=0;
if(!vis[x][y]&&box[x][y]=='.') //当当前位置没被访问num加1
++num;
++vis[x][y];
if(vis[x][y]>4) //当前位置访问超过4次结束
break;
bx=x;
by=y;
q.push(temp);
}
else{
cnt++; //碰到墙原地旋转一次
if(temp=='U')
q.push('R');
else if(temp=='R')
q.push('D');
else if(temp=='D')
q.push('L');
else
q.push('U');
}
}
else{
cnt++; //当超过边界就原地旋转一个方向
if(temp=='U')
q.push('R');
else if(temp=='R')
q.push('D');
else if(temp=='D')
q.push('L');
else
q.push('U');
}
}
cout<<num<<endl;
return 0;
}