leetcode 874. 模拟行走机器人(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) 处

提示:

  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

解法:

# define PR pair<long long, long long>

class Solution {
public:
    bool move(int& _x, int& _y, bool up, bool down, bool left, bool right, unordered_set<long long>& st){
        int x = _x, y = _y;
        if(up){
            y++;
        }else if(down){
            y--;
        }else if(left){
            x--;
        }else{
            x++;
        }
        long long pos = parse({x, y});
        if(st.find(pos) == st.end()){
            _x = x;
            _y = y;
            return true;
        }else{
            return false;
        }
    }
    
    long long parse(PR pr){
        long long x = pr.first, y = pr.second;
        return (x - 90000)*90000 + (y - 90000);
    }
    
    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
        unordered_set<long long> st;
        for(vector<int> obs : obstacles){
            st.insert(parse({obs[0], obs[1]}));
        }
        int x = 0, y = 0;
        int res = 0;
        bool up = true;
        bool down = false, left = false, right = false;
        for(int cmd : commands){
            if(cmd == -1){
                bool tmp = right;
                right = up;
                up = left;
                left = down;
                down = tmp;
            }else if(cmd == -2){
                bool tmp = up;
                up = right;
                right = down;
                down = left;
                left = tmp;
            }else{
                for(int i = 0; i < cmd; i++){
                    if(!move(x, y, up, down, left, right, st)){
                        break;
                    }else{
                        // cout<<x<<", "<<y<<endl;
                        res = max(res, x*x + y*y);
                    }
                }
            }
        }
        return res;
    }
};
posted @ 2019-04-06 23:03  zhanzq1  阅读(211)  评论(0编辑  收藏  举报