【LeetCode】874. 模拟行走机器人

机器人在无限网格上从 (0, 0) 出发,根据给定命令行走,避开障碍物。返回机器人经过路径的最大欧式距离平方。解决方案包括转向逻辑、障碍物处理及时间空间复杂度分析。" 117054627,10547178,C语言实现中断嵌套:中断和定时器实验,"['嵌入式开发', 'C语言编程', '单片机应用', '中断系统', '定时器技术']
摘要由CSDN通过智能技术生成

一、题目

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

  • -2:向左转 90 度
  • -1:向右转 90 度
  • 1 <= x <= 9:向前移动 x 个单位长度
    在网格上有一些格子被视为障碍物。

第 i 个障碍物位于网格点 (obstacles[i][0], obstacles[i][1])

机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,但仍然可以继续该路线的其余部分。

返回从原点到机器人所有经过的路径点(坐标为整数)的最大欧式距离的平方。

示例 1:

输入: commands = [4,-1,3], obstacles = []
输出: 25
解释: 机器人将会到达 (3, 4)

示例 2:

输入: commands = [4,-1,4,-2,4], obstacles = [[2,4]]
输出: 65
解释: 机器人在左转走到 (1, 8) 之前将被困在 (1, 4)

提示:

0 <= commands.length <= 10000
0 <= obstacles.length <= 10000
-30000 <= obstacle[i][0] <= 30000
-30000 <= obstacle[i][1] <= 30000
答案保证小于 2 ^ 31

二、解决

1、情景模拟

思路:

这题难点在于如何实现转向和在障碍物面前停止。下面重点讲一下这两块:

  • 转向
    1

  • 障碍物

障碍物位置信息由是一个二维数组组成,每个单元对应[x,y]信息。这里可以将x+" "+y合并起来放入一个Set中,如果在移动过程中,坐标信息如果在其中,则不再移动,直至遇到转向或者直接遍历结束。

  • 过程

具体可以参看下面代码,整体过程就是模拟行走过程,比较容易理解。

代码:

class Solution {
    public int robotSim(int[] commands, int[][] obstacles) {
        int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        
        // Set of obstacles indexes in the format of : obstacle[0] + " " + obstacle[1]
        Set<String> ops = new HashSet<>();
        for (int[] obstacle : obstacles) {
            ops.add(obstacle[0] + " " + obstacle[1]);
        }

        int x = 0, y = 0, index = 0, maxDistSquare = 0;
        for (int i = 0; i < commands.length; i++) {
            if (commands[i] == -2) { // Turns left
                index = (index + 3) % 4;
            } else if (commands[i] == -1) { // Turns right
                index = (index + 1) % 4;
            } else { // Moves forward commands[i] steps
                int step = 0;
                while (step < commands[i]) {
                    if (ops.contains((x + directions[index][0]) + " " + (y + directions[index][1])))  break; 
                    x += directions[index][0];
                    y += directions[index][1];
                    step++;
                }
            }
            maxDistSquare = Math.max(maxDistSquare, x * x + y * y);
        }

        return maxDistSquare;
    }
}

时间复杂度: O(N+K),N、K分别为commands和obstacles的长度。
空间复杂度: O(K)

三、参考

1、Logical Thinking with Clear Code
2、Java clean solution with explanation and comments
3、图解【模拟行走机器人】
4、【🐼熊猫刷题Python3】模拟,obstacles要存为set防超时(附视频题解)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值