&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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章