leetcode-874. 模拟行走机器人

874. 模拟行走机器人

题目链接

解题思路

使用hash+模拟就可以解决。

  1. 题目涉及东南西北四个在二维平面上的方向,我们就可以用四个二元组将这四个方向表示出来。东:{1,0},南:{0,-1},西:{-1,0},北:{0,1},这四个方向按照顺时针方向存到数组中就是北东南西,这样我们就可以根据题目要求,右转数组下标就右移,左转就左移,细节处理就是西右转和北左转,可以使用%4,也可以使用三目运算符。
  2. 然后就是遍历commands数组,-1就右转,-2就左转,否则就前进。但是前进方向有障碍物怎么办,这里我们使用hashpair存储障碍物的位置,查找的时候比一个一个比较就快很多。我本来使用的是基于哈希表实现的unordered_set,其查找速度是最快的,时间复杂度是0(1),可是他与pair的组合会报错(不知道为什么)。所以就使用了相对较慢的set。有关setunorder_set的比较可以看下文的表格。
  3. 保存好之后,就可以开始模拟了,这里前进的时候,每前进一步就查找一次,找到了就说明过不去,这个方向就不能继续前进。位置就要回退到前一步的位置,所以代码实现的时候加了一定小细节。找不到就说明可行,然后记录并找最大的。遍历完commands之后就可以返回最终结果。

在c++中set的底层实现以及优劣:

集合底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::set红黑树有序O(logn)O(logn)
std::multiset红黑树有序O(logn)O(logn)
std::unordered_set哈希表无序O(1)O(1)

代码实现

class Solution {
public:
    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) 
    {
        int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; //北东南西四个方向。
        int k=0; //初始方向为北
        int x=0,y=0; //当前机器人的坐标
        int res=0; //记录最终结果
        set<pair<int,int>>s; //使用set与pair来存障碍的位置
        for(int i=0;i<obstacles.size();i++) //将障碍存到s中
        {
            s.insert(pair(obstacles[i][0],obstacles[i][1]));
        }
        for(int a:commands) //开始遍历
        {
            if(a==-1)k=k==3?0:k+1; //右转,k后移
            else if(a==-2)k=k==0?3:k-1; //左转,k前移
            else
            {
                for(int i=0;i<a;i++)
                {
                    if(s.find(pair(x+dir[k][0],y+dir[k][1]))!=s.end()) //没有障碍就走下去,有就直接跳出循环,停止在这个方向继续前进
                        break;
                    x+=dir[k][0];
                    y+=dir[k][1];
                    res=max(res,x*x+y*y);
                }
            }
        }
        return res;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值