該題標籤:貪心算法;難度:簡單;根據題意,貪的是每個方向最長能走的路。其實也是根據題意,寫出的代碼
思路:先set存儲障礙點,以防重複。然後每個指令進行一次轉向或行走判斷是否到達障礙點的判斷。關於方向,根據順時針方向定義。其中,最大歐式距離的平方 不等於 最終位置的歐式距離,而是過程中所有的歐式距離的最大值
補充:
歐式距離即直線距離,曼哈頓距離即爲到達方式的距離(多個);切比雪夫距離(Chebyshev distance)或是L∞度量是向量空間中的一種度量,二個點之間的距離定義爲其各座標數值差的最大值
題目:
- 模擬行走機器人
機器人在一個無限大小的網格上行走,從點 (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
解法:
// 時間 O(n+k) 空間 O(k) n,k分別兩數組長度
/**
* @param {number[]} commands
* @param {number[][]} obstacles
* @return {number}
*/
var robotSim = function(commands, obstacles) {
let obstaclesSet = new Set()
for(let i = 0; i < obstacles.length; i++){
obstaclesSet.add(obstacles[i][0] + '_' + obstacles[i][1])
}
let dir = 0, x = 0, y = 0 // 起始位置及方向 0123 -> 北東南西
let dx = [0, 1, 0, -1], dy = [1, 0, -1, 0]; // 各方向唯一距離,得到方向即可計算
let res = 0
for(let i = 0; i < commands.length; i++){
if(commands[i] === -2){ // 向左轉90
dir = (dir + 3) % 4
}else if(commands[i] === -1){ // 向右轉90
dir = (dir + 1) % 4
}else{
for(let j = 1; j <= commands[i]; j++){
let nx = x + dx[dir], ny = y + dy[dir]
if(!obstaclesSet.has(nx + '_' + ny)){
x = nx
y = ny
res = Math.max(res, x*x + y*y)
}else{
break;
}
}
}
// console.log("x,y,dir", x, y, dir)
}
return res
};