1. 程式人生 > >Leetcode874.Walking Robot Simulation模擬行走的機器人

Leetcode874.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

題目感覺沒有說清楚,應該說是過程中最大的歐式平方

class Solution {
public:
    int robotSim(vector<int>& commands, vector<vector<int> >& obstacles) {
        map<pair<int, int>, bool> check;
        for(int i = 0; i < obstacles.size(); i++)
        {
            check[make_pair(obstacles[i][0], obstacles[i][1])] = true;
        }
        //北東南西
        int dir = 0;
        int res = 0;
        int currentx = 0;
        int currenty = 0;
        int dx[4] = {0, 1, 0, -1};
        int dy[4] = {1, 0, -1, 0};
        for(int i = 0; i < commands.size(); i++)
        {
            if(commands[i] == -1)
            {
                dir = (dir + 1) % 4;
            }
            else if(commands[i] == -2)
            {
                dir = (dir + 4 - 1) % 4;
            }
            else
            {
                int step = commands[i];
                for(int i = 0; i < step; i++)
                {
                    int newx = currentx + dx[dir];
                    int newy = currenty + dy[dir];
                    if(check[make_pair(newx, newy)] == false)
                    {
                        currentx = newx;
                        currenty = newy;
                        res = max(res, currentx * currentx + currenty * currenty);
                    }
                }
            }
        }
        return res;
    }
};