leetcode 874. 模拟行走机器人 中等

机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令 commands

  • -2 :向左转 90
  • -1 :向右转 90
  • 1 <= x <= 9 :向前移动 x 个单位长度

在网格上有一些格子被视为障碍物 obstacles 。第 i 个障碍物位于网格点 obstacles[i] = (xi, yi)

机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,并继续执行下一个命令。

返回机器人距离原点的 最大欧式距离平方 。(即,如果距离为 5 ,则返回 25

注意:

  • 北方表示 +Y 方向。
  • 东方表示 +X 方向。
  • 南方表示 -Y 方向。
  • 西方表示 -X 方向。
  • 原点 0,0 可能会有障碍物。

示例 1:

复制代码
输入:commands = [4,-1,3], obstacles = []
输出:25
解释:
机器人开始位于 (0, 0):
1. 向北移动 4 个单位,到达 (0, 4)
2. 右转
3. 向东移动 3 个单位,到达 (3, 4)
距离原点最远的是 (3, 4) ,距离为 32 + 42 = 25

示例 2:

复制代码
输入:commands = [4,-1,4,-2,4], obstacles = [[2,4]]
输出:65
解释:机器人开始位于 (0, 0):
1. 向北移动 4 个单位,到达 (0, 4)
2. 右转
3. 向东移动 1 个单位,然后被位于 (2, 4) 的障碍物阻挡,机器人停在 (1, 4)
4. 左转
5. 向北走 4 个单位,到达 (1, 8)
距离原点最远的是 (1, 8) ,距离为 12 + 82 = 65

示例 3:

复制代码
输入:commands = [6,-1,-1,6], obstacles = []
输出:36
解释:机器人开始位于 (0, 0):
1. 向北移动 6 个单位,到达 (0, 6).
2. 右转
3. 右转
4. 向南移动 6 个单位,到达 (0, 0).
机器人距离原点最远的点是 (0, 6),其距离的平方是 62 = 36 个单位。

提示:

  • 1 <= commands.length <= 10^4
  • commands[i] 的值可以取 -2-1 或者是范围 [1, 9] 内的一个整数。
  • 0 <= obstacles.length <= 10^4
  • -3 * 10^4 <= xi, yi <= 3 * 10^4
  • 答案保证小于 2^31

分析:用一个数字变量 dir 标记面朝的方向,总共 4 个方向,因此可以用 0~3 分别代表西、北、东、南,初始朝北,dir=1,向左转时 dir--,向右转时 dir++,自增自减后对 4 取模。

模拟一步一步走时移动的情况,碰到障碍物时偏转方向,再继续走。最后计算到原点的距离即可。

cpp 复制代码
class Solution {
public:
    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
        map<pair<int,int>,int>mp;
        int n=commands.size(),len=obstacles.size(),dir=1,x=0,y=0,ans=0;
        for(int i=0;i<len;++i)
            mp[{obstacles[i][0],obstacles[i][1]}]=1;
        for(int i=0;i<n;++i)
        {
            if(commands[i]==-1)dir=(dir+1)%4;
            else if(commands[i]==-2)dir=(dir-1+4)%4;
            else
            {
                for(int t=0;t<commands[i];++t)
                {
                    int xx=x,yy=y;
                    if(dir==0)xx--;
                    else if(dir==1)yy++;
                    else if(dir==2)xx++;
                    else yy--;
                    
                    if(mp[{xx,yy}])break;
                    else x=xx,y=yy,ans=max(x*x+y*y,ans);
                }
            }
        }
        return ans;
    }
};
相关推荐
yyds_yyd_1008610 小时前
1464. 数组中两元素的最大乘积(2026.07.27)
数据结构·c++·算法·leetcode
玖玥拾13 小时前
LeetCode 26 删除有序数组中的重复项
算法·leetcode
白白白小纯15 小时前
算法篇—返回倒数第k个节点
c语言·数据结构·算法·leetcode
退休倒计时15 小时前
【复习】LeetCode 二叉树DFS TypeScript
算法·leetcode·typescript·深度优先
白白白小纯17 小时前
算法篇—链表的中间节点
c语言·数据结构·算法·leetcode
Frostnova丶18 小时前
(19)LeetCode 54. 螺旋矩阵
算法·leetcode·矩阵
Frostnova丶18 小时前
(18)LeetCode 73. 矩阵置零
算法·leetcode·矩阵
番茄撒旦在上18 小时前
LeetCode 98.验证二叉搜索树-Medium
算法·leetcode
rannn_11118 小时前
【力扣hot100】哈希表专题——从两数之和到最长连续序列
java·算法·leetcode·哈希
go不是csgo19 小时前
从模板到五道 LeetCode:完全背包的 Golang 教学笔记
笔记·leetcode·golang