874.walking-robot-simulation

874. 模拟行走机器人

题目描述

模拟机器人行走,默认向北,-1左转90度,-2右转90度,1-9表示前进。另有表示障碍的二维数组,遇到障碍往障碍后退一格。求经过的点到原点欧氏距离最大值。

思路

顺着题目描述暴力解。题目看清!是求最大值!但是超时了。

官方思路

机器人每试图走一个位置,就用此位置与障碍物集合列表里的坐标进行比较,看是否刚好是障碍物坐标点。
必须注意使用 集合 Set 作为对障碍物使用的数据结构,以便我们可以有效地检查下一步是否受阻。如果不这样做,我们检查 该点是障碍点吗 可能会慢大约 10000 倍。
PS:既然用3,2,1,0表示了东南西北,那就在移动的时候把它利用起来啊喂!还分什么情况讨论就!

代码
class Solution {
public:
    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
        int dir=0;//方向,初始为北
        int x=0,y=0;//当前位置
        bool flag=1;//可以通行
        int ans=0;
        int direx[] = {0,-1,0,1};
        int direy[] = {1,0,-1,0};
        set<pair<int, int>> obstacleSet;
        for(int i=0;i<obstacles.size();i++)
            obstacleSet.insert(make_pair(obstacles[i][0], obstacles[i][1]));
        for(int i=0;i<commands.size();i++){
            if(commands[i]>=0){
                flag=1;
                for(int j=0;j<commands[i];j++){
                    int nx = x + direx[dir];
                    int ny = y + direy[dir];
                    if (obstacleSet.find(make_pair(nx, ny)) == obstacleSet.end()) {
                        x = nx;
                        y = ny;
                        ans = max(ans, x*x + y*y);
                    }else{
                        break;
                    }
                }
            }
            else if(commands[i]==-2){
                dir=(dir+1)%4;
            }
            else if(commands[i]==-1){
                dir=(dir+3)%4;
            }
        }
        return ans;
    }
};
知识点

set——关联容器

  • set以RBTree作为底层容器
  • 所得元素的只有key没有value,value就是key
  • 不允许出现键值重复
  • 所有的元素都会被自动排序
  • 不能通过迭代器来改变set的值,因为set的值就是键
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值