題目地址:
https://leetcode.com/problems/walking-robot-simulation/
給定一個二維網格,有個機器人從出發,再給定一系列命令,以整數表示表示向右轉,表示向左轉,其餘的命令都是表示向前走若干步。再給定一系列障礙物的座標,機器人走的路上如果有障礙物,則會停在障礙物之前。一開始機器人是向上走的。問命令執行完之前機器人距離原點的歐幾里得距離的平方的最大值。
先用一個類表示座標,然後開一個哈希表存儲所有的障礙物座標。接着直接模擬機器人走的路徑,用一個變量表示當前的方向即可。每走一步先看一下是否到了障礙物,如果到了則退出,否則走一步。每次機器人停留的時候更新一下得到的最大歐幾里得距離平方。代碼如下:
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class Solution {
class Pair {
int x, y;
Pair(int x, int y) {
this.x = x;
this.y = y;
}
// 返回當前位置與原點歐幾里得距離的平方
public int square() {
return x * x + y * y;
}
@Override
public boolean equals(Object o) {
Pair pair = (Pair) o;
return x == pair.x && y == pair.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
public int robotSim(int[] commands, int[][] obstacles) {
int res = 0;
// 如果當前方向用i來表示,那麼方向單位向量爲(dir[i], dir[i + 1]);
// 如果要向右轉,則將i加1後模4,如果向左轉則將i加3後模4
int[] dir = {0, 1, 0, -1};
int curDir = 0;
// 存所有障礙物的座標
Set<Pair> obs = new HashSet<>();
for (int i = 0; i < obstacles.length; i++) {
obs.add(new Pair(obstacles[i][0], obstacles[i][1]));
}
// 表示當前位置座標
Pair cur = new Pair(0, 0);
for (int i = 0; i < commands.length; i++) {
if (commands[i] == -1) {
curDir = (curDir + 1) % 4;
} else if (commands[i] == -2) {
curDir = (curDir + 3) % 4;
} else {
// 取出方向單位向量
int dx = dir[curDir], dy = dir[(curDir + 1) % 4];
// 向該方向走若干步
for (int j = 0; j < commands[i]; j++) {
// 遇到障礙了,直接退出循環
if (obs.contains(new Pair(cur.x + dx, cur.y + dy))) {
break;
}
cur.x += dx;
cur.y += dy;
}
}
// 更新答案
res = Math.max(res, cur.square());
}
return res;
}
}
時間複雜度,爲命令個數;空間,爲障礙物個數。