【每日一题Day270】LC874模拟行走机器人 | 哈希表+模拟

57 篇文章 0 订阅
57 篇文章 0 订阅
该问题是一个关于编程竞赛的算法题,涉及机器人在无限网格上的移动。机器人初始位置为(0,0),根据右转、左转和前进的指令移动,同时避开障碍物。解决方案包括使用状态压缩来表示方向变化,用哈希表存储障碍物位置,并在移动过程中检查是否遇到障碍。最后计算并返回机器人经过路径的最大欧式距离的平方。
摘要由CSDN通过智能技术生成

模拟行走机器人【LC874】

机器人在一个无限大小的 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 1 2 3分别表示北、东、南、西,假设此时方向为dir,那么

      • 右转时,方向变为 ( d i r + 1 ) % 4 (dir+1)\%4 (dir+1)%4
      • 左转时,方向变为 ( d i r + 3 ) % 4 (dir+3)\%4 (dir+3)%4
    • 然后思考如何判断再移动过程中是否遇到障碍物?

      • 由于移动步数最大为9,那么可以逐一判断每个位置是否有障碍物,将障碍物的二维坐标转化为一维坐标存储在哈希表中。由于障碍物坐标 − 3 ∗ 1 0 4 < = x i , y i < = 3 ∗ 1 0 4 -3 * 10^4 <= xi, yi <= 3 * 10^4 3104<=xi,yi<=3104,因此矩阵列数可以取30000

      • 如果没有障碍物,那么向指定方向移动,并求出该位置与原点的距离,判断是否需要更新;否则,停止移动

  • 实现

    class Solution {
        public int robotSim(int[] commands, int[][] obstacles) {
            int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};// -1 方向坐标右移,-2方向坐标左移
            // 如何判断在移动过程中是否遇到障碍物,1<= x<=9,将障碍物存储在哈希表中,逐个判断
            // 二维-> 一维 (数据范围:6 * 10^4 *6 * 10^4)
            Set<Integer> obs = new HashSet<>();
            int n = 30000;
            int res = 0, i = 0;
            int x = 0, y = 0;
            for (int[] o : obstacles){
                obs.add(o[0] * n + o[1]);
            }
            for (int c : commands){
                if (c == -1){
                    i = (i + 1) % 4;
                }else if (c == -2){
                    i = (i + 3) % 4;
                }else{
                    int j = 0;
                    while (j < c){
                        int newX = x + dirs[i][0], newY = y + dirs[i][1];
                        if (!obs.contains(newX * n + newY)){                        
                            res = Math.max(res, newX * newX + newY * newY);
                            x = newX; 
                            y = newY;
                        }
                        j++;
                    }
                }
            }
            return res;
            
    
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( C ∗ n + m ) \mathcal{O}(C*n+m) O(Cn+m) n n n为指令长度, m m m为障碍物数量, C C C为最大移动步数
      • 空间复杂度: O ( m ) \mathcal{O}(m) O(m)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值