开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情
机器人大冒险
力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种:
U: 向y轴正方向移动一格 R: 向x轴正方向移动一格。 不幸的是,在 xy 平面上还有一些障碍物,他们的坐标用obstacles表示。机器人一旦碰到障碍物就会被损毁。
给定终点坐标(x, y),返回机器人能否完好地到达终点。如果能,返回true;否则返回false。
示例1:
输入:command = "URR", obstacles = [], x = 3, y = 2
输出:true
解释:U(0, 1) -> R(1, 1) -> R(2, 1) -> U(2, 2) -> R(3, 2)。
示例2:
输入:command = "URR", obstacles = [[2, 2]], x = 3, y = 2
输出:false
解释:机器人在到达终点前会碰到(2, 2)的障碍物。
示例3:
输入:command = "URR", obstacles = [[4, 2]], x = 3, y = 2
输出:true
解释:到达终点后,再碰到障碍物也不影响返回结果。
限制:
- 2 <= command的长度 <= 1000
- command由U,R构成,且至少有一个U,至少有一个R
- 0 <= x <= 1e9, 0 <= y <= 1e9
- 0 <= obstacles的长度 <= 1000
- obstacles[i]不为原点或者终点
解题思路:
- 能到达终点要满足(1)在运动轨迹内 (2)如果在到达终点前,路径有障碍则会失败
- 循环执行指令,将指令的运动轨迹存下来
- 实现方法来判断是否在运动轨迹内
- 遍历obstacles取得a,b,如果满足a<x,b<y并且在运动轨迹上,则表示到达终点前,路径有障碍。
我的答案:
/**
* @param {string} command
* @param {number[][]} obstacles
* @param {number} x
* @param {number} y
* @return {boolean}
*/
var robot = function (command, obstacles, x, y) {
let start = [0, 0]
let seat = new Map();
let countx = 0, county = 0;
seat.set("0,0", 0);
for (let i = 0; i < command.length; i++) {
if (command[i] == "U") {
start[1]++;
county++
} else {
start[0]++;
countx++;
}
seat.set(start.join(","), 0);
}
if (!inline(x, y, seat, countx, county)) return false
for (let i = 0; i < obstacles.length; i++) {
let [a, b] = obstacles[i]
if (a <= x && b <= y && inline(a, b, seat, countx, county)) {
return false;
}
}
return true;
};
function inline(x, y, seat, countx, county) {
if (seat.has(x + ',' + y)) {
return true
}
let scale = Math.floor(x / countx)
let [a, b] = [x - scale * countx, y - scale * county]
if (seat.has(a + ',' + b)) {
return true
}
return false;
}
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )