leetcode 算法题874 (简单228) 模拟行走机器人
- 题目介绍
机器人在一个无限大小的网格上行走,
从点 (0, 0) 处开始出发,面向北方。
该机器人可以接收以下三种类型的命令:
-2:向左转 90 度
-1:向右转 90 度
1 <= x <= 9:向前移动 x 个单位长度
在网格上有一些格子被视为障碍物。
第 i 个障碍物位于网格点 (obstacles[i][0], obstacles[i][1])
如果机器人试图走到障碍物上方,
那么它将停留在障碍物的前一个网格方块上,
但仍然可以继续该路线的其余部分。
返回从原点到机器人的最大欧式距离的平方。
- 示例
输入: commands = [4,-1,3], obstacles = []
输出: 25
解释: 机器人将会到达 (3, 4)
输入: 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
- 解法一
/**
* @param {number[]} commands
* @param {number[][]} obstacles
* @return {number}
*/
var robotSim = function(commands, obstacles) {
let point = [0, 0], i = 0, flag = 0, oSet = new Set(obstacles.map(item => item.join('_'))), max = 0;
while(i < commands.length) {
switch(commands[i]) {
case -2:
flag++;
break
case -1:
flag--;
break
default:
point = command(point, flag, commands[i], oSet);
max = Math.max(max, point[0] * point[0] + point[1] * point[1])
break
}
i++;
}
return max;
};
let count = 0;
const command = (point, flag, distance, oSet) => {
count++;
flag %= 4;
if(flag < 0) {
flag += 4;
}
let nexts = [], i = 1;
if(flag === 0) {
while(distance >= 0) {
nexts.unshift([point[0], point[1] + distance--])
}
} else if(flag === 2) {
while(distance >= 0) {
nexts.unshift([point[0], point[1] - distance--])
}
} else if(flag === 1) {
while(distance >= 0) {
nexts.unshift([point[0] - distance--, point[1]])
}
} else if(flag === 3){
while(distance >= 0) {
nexts.unshift([point[0] + distance--, point[1]])
}
}
while(i < nexts.length) {
if(oSet.has(nexts[i].join('_'))) {
console.log(nexts[i].join('_'), i, count, point)
return nexts[i - 1];
}
i++;
}
return nexts[i - 1];
}
执行用时 : 236 ms, 在所有 JavaScript 提交中击败了92.50%的用户
内存消耗 : 57 MB, 在所有 JavaScript 提交中击败了36.36%的用户