列表

详情


874. 模拟行走机器人

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

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

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

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

 

注意:

  • 北表示 +Y 方向。
  • 东表示 +X 方向。
  • 南表示 -Y 方向。
  • 西表示 -X 方向。

 

示例 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

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) { } };

python3 解法, 执行用时: 132 ms, 内存消耗: 20.6 MB, 提交时间: 2023-07-19 09:22:52

class Solution:
    def robotSim(self, commands: List[int], obstacles: List[List[int]]) -> int:
        dirs = (0, 1, 0, -1, 0)  # (dirs[0], dirs[1]) 向北, (dirs[1], dirs[2]) 向东, 以此类推
        s = {(x, y) for x, y in obstacles}  # 障碍物去重
        ans = k = 0  # k 是机器人当前方向, k=0/1/2/3对应北、东、南、西
        x = y = 0  # 机器人当前坐标, (x, y)
        for c in commands:
            if c == -2:  # 左转 90 度, 逆时针
                k = (k + 3) % 4
            elif c == -1:  # 右转 90 度,顺时针
                k = (k + 1) % 4
            else:
                for _ in range(c):
                    nx, ny = x + dirs[k], y + dirs[k + 1]  # 累加坐标未知
                    if (nx, ny) in s:  # 障碍物是否在变化的坐标中
                        break
                    x, y = nx, ny
                    ans = max(ans, x * x + y * y)
        return ans

javascript 解法, 执行用时: 76 ms, 内存消耗: 47.8 MB, 提交时间: 2023-07-19 09:12:02

/**
 * @param {number[]} commands
 * @param {number[][]} obstacles
 * @return {number}
 */
var robotSim = function(commands, obstacles) {
    const dirs = [[-1, 0], [0, 1], [1, 0], [0, -1]];
    let px = 0, py = 0, d = 1;
    let set = new Set();
    for (const obstacle of obstacles) {
        set.add(obstacle[0] * 60001 + obstacle[1]);
    }
    let res = 0;
    for (const c of commands) {
        if (c < 0) {
            d += c == -1 ? 1 : 3;
            d %= 4;
        } else {
            for (let i = 0; i < c; i++) {
                if (set.has((px + dirs[d][0]) * 60001 + py + dirs[d][1])) {
                    break;
                }
                px += dirs[d][0];
                py += dirs[d][1];
                res = Math.max(res, px * px + py * py);
            }
        }
    }
    return res;
}

golang 解法, 执行用时: 40 ms, 内存消耗: 6.9 MB, 提交时间: 2023-07-19 09:11:36

func robotSim(commands []int, obstacles [][]int) int {
    dirs := [][]int{{-1, 0}, {0, 1}, {1, 0}, {0, -1}}
    px, py, d := 0, 0, 1
    set := make(map[int]bool)
    for _, obstacle := range obstacles {
        set[obstacle[0] * 60001 + obstacle[1]] = true
    }
    res := 0
    for _, c := range commands {
        if c < 0 {
            if c == -1 {
                d = (d + 1) % 4
            } else {
                d = (d + 3) % 4
            }
        } else {
            for i := 0; i < c; i++ {
                if set[(px + dirs[d][0]) * 60001 + py + dirs[d][1]] {
                    break
                }
                px += dirs[d][0]
                py += dirs[d][1]
                res = max(res, px * px + py * py)
            }
        }
    }
    return res
}

func max(a, b int) int { if a > b { return a }; return b }

java 解法, 执行用时: 11 ms, 内存消耗: 47.1 MB, 提交时间: 2023-07-19 09:09:48

class Solution {
    public int robotSim(int[] commands, int[][] obstacles) {
        int[][] dirs = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
        int px = 0, py = 0, d = 1;
        Set<Integer> set = new HashSet<Integer>();
        for (int[] obstacle : obstacles) {
            set.add(obstacle[0] * 60001 + obstacle[1]);
        }
        int res = 0;
        for (int c : commands) {
            if (c < 0) {
                d += c == -1 ? 1 : -1;
                d %= 4;
                if (d < 0) {
                    d += 4;
                }
            } else {
                for (int i = 0; i < c; i++) {
                    if (set.contains((px + dirs[d][0]) * 60001 + py + dirs[d][1])) {
                        break;
                    }
                    px += dirs[d][0];
                    py += dirs[d][1];
                    res = Math.max(res, px * px + py * py);
                }
            }
        }
        return res;
    }
}

python3 解法, 执行用时: 116 ms, 内存消耗: 21 MB, 提交时间: 2023-07-19 09:09:27

# 模拟机器人行走
class Solution:
    def robotSim(self, commands: List[int], obstacles: List[List[int]]) -> int:
        dirs = [[-1, 0], [0, 1], [1, 0], [0, -1]]  # 四个方向,下、上、右、左
        px, py, d = 0, 0, 1 # px,py代表当前坐标,d代表当前方向
        mp = set([tuple(i) for i in obstacles])
        res = 0
        for c in commands:
            if c < 0:
                d += 1 if c == -1 else -1
                d %= 4
            else:
                for i in range(c):
                    if tuple([px + dirs[d][0], py + dirs[d][1]]) in mp:
                        break
                    px, py = px + dirs[d][0], py + dirs[d][1]
                    res = max(res, px * px + py * py)
        return res

上一题