【Leetcode】874. Walking Robot Simulation模拟行走机器人

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

**【思路】
需返回的距离是最大的距离,而不是机器人到达终点之后到起点的距离

题目关键是要把3种指令统一起来。
用二维数组 {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}   表示`北、东、南、西`
  -2:向左转 90 度 ——dir = (dir -1 + 4)%4;
  -1:向右转 90 度 ——dir = (dir + 1)%4;
  1 <= x <= 9:向前移动 x 个单位长度——
 关键是在移动过程中是否遇到障碍物。**
代码:
class Solution {
public:
    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
      unordered_set < string > ob; //set容器定义
        for(auto o:obstacles)
        {
        ob.insert(to_string(o[0]) + "," + to_string(o[1])); //to_string()先转化成string 再插入
        }
        int dir = 0,x = 0, y = 0,res = 0;
        vector<vector<int>> dirs = {{0,1},{1,0},{0,-1},{-1,0}}; //北、东、南、西
        for(auto c:commands)
        {
          if(c == -1)
             dir = (dir + 1)%4; //确定方向
          else if( c == -2)
                 dir = (dir -1 + 4)%4; //确定方向
               else 
                 while(c&& ob.find(to_string(x + dirs[dir][0])+ ","+to_string(y + dirs[dir][1])) ==ob.end())  //判断是否遇到障碍(若ob.find() == ob.end()表示没有查找到)
                 {
                     x += dirs[dir][0];
                     y += dirs[dir][1]; //移动
                     c--;
                 }
            res = max(res , x*x+y*y); //保留最大距离
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_42703504/article/details/84879894