LeetCode 2069. 模拟行走机器人 II(模拟)

简介: LeetCode 2069. 模拟行走机器人 II(模拟)

文章目录


1. 题目

2. 解题


1. 题目


给你一个在 XY 平面上的 width x height 的网格图,左下角 的格子为 (0, 0) ,右上角 的格子为 (width - 1, height - 1) 。

网格图中相邻格子为四个基本方向之一("North","East","South" 和 "West")。一个机器人 初始 在格子 (0, 0) ,方向为 "East" 。


机器人可以根据指令移动指定的 步数 。每一步,它可以执行以下操作。


沿着当前方向尝试 往前一步 。

如果机器人下一步将到达的格子 超出了边界 ,机器人会 逆时针 转 90 度,然后再尝试往前一步。

如果机器人完成了指令要求的移动步数,它将停止移动并等待下一个指令。


请你实现 Robot 类:


Robot(int width, int height) 初始化一个 width x height 的网格图,机器人初始在 (0, 0) ,方向朝 "East" 。

void move(int num) 给机器人下达前进 num 步的指令。

int[] getPos() 返回机器人当前所处的格子位置,用一个长度为 2 的数组 [x, y] 表示。

String getDir() 返回当前机器人的朝向,为 “North” ,“East” ,“South” 或者 “West” 。

示例 1:

image.png

输入:
["Robot", "move", "move", "getPos", "getDir", "move", "move", "move", "getPos", "getDir"]
[[6, 3], [2], [2], [], [], [2], [1], [4], [], []]
输出:
[null, null, null, [4, 0], "East", null, null, null, [1, 2], "West"]
解释:
Robot robot = new Robot(6, 3); // 初始化网格图,机器人在 (0, 0) ,朝东。
robot.move(2);  // 机器人朝东移动 2 步,到达 (2, 0) ,并朝东。
robot.move(2);  // 机器人朝东移动 2 步,到达 (4, 0) ,并朝东。
robot.getPos(); // 返回 [4, 0]
robot.getDir(); // 返回 "East"
robot.move(2);  // 朝东移动 1 步到达 (5, 0) ,并朝东。
                // 下一步继续往东移动将出界,所以逆时针转变方向朝北。
                // 然后,往北移动 1 步到达 (5, 1) ,并朝北。
robot.move(1);  // 朝北移动 1 步到达 (5, 2) ,并朝 北 (不是朝西)。
robot.move(4);  // 下一步继续往北移动将出界,所以逆时针转变方向朝西。
                // 然后,移动 4 步到 (1, 2) ,并朝西。
robot.getPos(); // 返回 [1, 2]
robot.getDir(); // 返回 "West"
提示:
2 <= width, height <= 100
1 <= num <= 10^5
move ,getPos 和 getDir 总共 调用次数不超过 10^4 次。



2. 解题


  • 只能在最外圈行走,先看能走几个完整的圈,只需要模拟剩余的不能构成整圈的步数
  • 初始方向根据是否在四个顶点确定
class Robot {
    vector<string> dirname = {"East", "North", "West", "South"};
    vector<vector<int>> dir = {{1,0},{0,1},{-1,0},{0,-1}};
    vector<vector<int>> endpoint;
    int x = 0, y = 0, d = 0; // d 方向编号
    int xlimit, ylimit;
public:
    Robot(int width, int height) {
        xlimit = width;
        ylimit = height;
        endpoint.resize(4);
        endpoint[0] = {width-1, 0};
        endpoint[1] = {width-1, height-1};
        endpoint[2] = {0, height-1};
        endpoint[3] = {0, 0};
    }
    void move(int num) {
        //机器人只能沿着外圈走,一圈是多少步 2w+2h-4
        int circle = num/(2*xlimit+2*ylimit-4);
        num = num - (2*xlimit+2*ylimit-4)*circle;
        // 现在还剩余num步,位置还在 (x, y), 方向看是否在端点上
        for(int i = 0; i < 4; ++i)
        {
            if(x==endpoint[i][0] && y==endpoint[i][1])
            {
                d = i;
                break;
            }
        }
        while(num)
        {
            if(inEnd(x, y))//在端点上,还要走,需要变方向
                d = (d+1)%4;
            if(num >= abs(endpoint[d][0]-x)+abs(endpoint[d][1]-y))
            { // 够走到尽头
                num -= abs(endpoint[d][0]-x)+abs(endpoint[d][1]-y);
                x = endpoint[d][0];
                y = endpoint[d][1];
            }
            else // 不够走到头
            {
                x += dir[d][0]*num;
                y += dir[d][1]*num;
                num = 0;
            }
        }
    }
    vector<int> getPos() {
        return {x, y};
    }
    string getDir() {
        return dirname[d];
    }
    bool inEnd(int a, int b)
    {
        return (a==0&&b==0) || (a==0&&b==ylimit-1) || (a==xlimit-1&&b==0) || (a==xlimit-1&&b==ylimit-1);
    }
};

200 ms 117.7 MB C++

相关文章
|
2月前
|
机器人
【每日一题Day270】LC874模拟行走机器人 | 哈希表+模拟
【每日一题Day270】LC874模拟行走机器人 | 哈希表+模拟
29 0
|
9月前
|
机器人
【Leetcode -657.机器人能否返回原点 -674.最长连续递增序列】
【Leetcode -657.机器人能否返回原点 -674.最长连续递增序列】
25 0
|
19天前
|
算法 机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
|
12月前
|
存储 机器人 C++
leetcode 每日一题 874. 模拟行走机器人 c++模拟解法
简单来说就是机器人在一个矩阵上移动 我们要找到一个离原点的一个最大欧式距离的平方
106 0
|
2月前
|
机器人
[leetcode 脑子急转弯] 2731. 移动机器人
[leetcode 脑子急转弯] 2731. 移动机器人
|
2月前
|
算法 机器人 测试技术
二分查找|双指针:LeetCode:2398.预算内的最多机器人数目
二分查找|双指针:LeetCode:2398.预算内的最多机器人数目
|
2月前
|
算法 机器人 测试技术
二分查找|双指针:LeetCode:2398.预算内的最多机器人数目
二分查找|双指针:LeetCode:2398.预算内的最多机器人数目
|
18天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
18天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
19天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值