Cleaner Robot(CF 589J)

29 篇文章 0 订阅
11 篇文章 0 订阅

这道题一开始我题意理解不清楚,匆忙做了,却卡在样例三,这里记录一下这道题,卡了挺久。

题目大意:一个清洁机器人打扫房间,从某个地方开始清扫,当遇到障碍物或超出边界时,顺时针旋转继续清扫,一开始给出一个图,图中标了’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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值