leetcode 874 模拟行走机器人

874. 模拟行走机器人

难度简单120收藏分享切换为英文接收动态反馈

机器人在一个无限大小的网格上行走,从点 (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) 处

 

提示:

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

题解:这道题目,首先理解就很困难,看完评论是这样的:

  /*

        *题意说明

        *1.障碍物数组是[[x1,y2],[x2,y2],...,[xn,yn],...]这样的结构,其中每个二元组代表一个障碍的x和y坐标

        *2.机器人机器人在前进的过程中遇到障碍会原地踏步,直到转向。 

        *3.要求的不是机器人执行完指令序后最终的位置到初始位置的欧式距离,而是整个过程中所达到最大欧式距离。

        */

根据这个来求解,按照题意进行运动学递推,当遇到障碍物的时候,停下来等待转向。但是,直接写的话,超时了,时间主要花费在下一个位置是不是障碍物的判断上。那么有没有时间短的判断呢?点的数据结构,很像是map,一个x对应一个y,那么由障碍物的信息构建一个map,即可用快速判断下一个位置是不是在障碍物里面。(如果面向题目编程的话),产生了以下答案;

class Solution {
public:
    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
        /*
        *题意说明
        *1.障碍物数组是[[x1,y2],[x2,y2],...,[xn,yn],...]这样的结构,其中每个二元组代表一个障碍的x和y坐标
        *2.机器人机器人在前进的过程中遇到障碍会原地踏步,直到转向。 
        *3.要求的不是机器人执行完指令序后最终的位置到初始位置的欧式距离,而是整个过程中所达到最大欧式距离。
        */
        unordered_map<int, bool> m;
        for (auto & v : obstacles) {
            m[v[0] * 30000 + v[1]] = true;
        }
    
        int i = 0, j = 0, ret = 0, dir = 0;
        int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
        for (auto & c : commands) {
            if (c == -1)
                dir = (dir + 1) % 4;
            else if (c == -2)
                dir = (dir - 1 + 4) % 4;
            else {
                for (int k = 0; k < c; k++) {
                    if (!m[(i + dx[dir]) * 30000 + j + dy[dir]]) {
                        i += dx[dir];
                        j += dy[dir];
                        ret = max(ret, i * i + j * j);
                    }
                }
            }
        }
        return ret;
    }
};

障碍物的最大值不超过30000,利用这个构建一个唯一的散列表。 

 

上一篇:高精乘


下一篇:一文读透php到底是不是最好的语言