&LeetCode874& 模拟行走机器人

题目

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

来源:力扣(LeetCode

思路

首先,对于障碍物,因为要经常地查找下一个位置是否有障碍物,所以就用一个HashSet 将所有的障碍物位置存进去;
由于坐标位置是二维存在的,需要进行降维处理,可以将横纵坐标都转为字符串,然后在中间加个短横线隔开,如此就可以把二维坐标变为一个字符串了;
然后,就是处理所有的命令了,在传统的迷宫遍历中,通常使用方向数组来控制遍历的方向,这里也是同样需要的;
但不同的是,本题地方向顺序也是有讲究的,因为机器人初始状态是朝北的,所以方向数组的第一个应该是朝北走,上北下南左西右东,这样方向数组的顺序应该是上右下左。
再次,用一个变量 idx 来表示方向数组中的当前坐标,当遇到 -1,即右转时,idx 自增1即可,为了防止越界,需要对4取余;
同理,当遇到 -2,即左转时,idx 自减1即可,同样为了防止越界,先加4,再对4取余;
其次,当遇到正数命令时,此时就是前进,用两个变量x和y分别表示当前位置的横纵坐标且初始化为0,分别加上方向数组中对应位置的值,即就是下一个位置的坐标;
最后,本题重要的是看有没有障碍物,到 HashSet 中去查找,若没有障碍物,则可以到达,同时更新x和y为新的位置,继续 while 循环即可;
当每个命令执行完了之后,用当前的x和y距离原点的距离更新一个结果 res 即可。

C++代码

class Solution {
public:
    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) 
    {
        int res = 0, x = 0, y = 0, idx = 0;
        unordered_set<string> obs;

        for (auto a : obstacles)
            obs.insert(to_string(a[0]) + "-" + to_string(a[1]));

        vector<int> dirX{0, 1, 0, -1}, dirY{1, 0, -1, 0};

        for (int command : commands)
        {
            if (command == -1)
                idx = (idx + 1) % 4;
            else if (command == -2)
                idx = (idx -1 + 4) % 4;
            else
            {
                while (command-- > 0 && !obs.count(to_string(x + dirX[idx]) + "-" + to_string(y + dirY[idx])))
                {
                    x += dirX[idx];
                    y += dirY[idx];
                }
            }
            res = max(res, x * x + y * y);
        }
        return res;
    }
};
发布了51 篇原创文章 · 获赞 20 · 访问量 2086

猜你喜欢

转载自blog.csdn.net/weixin_40482465/article/details/104482619