java: add «874. Walking Robot Simulation»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
4d20c963ba
commit
92e7ac3d19
1 changed files with 57 additions and 0 deletions
57
java/walking-robot-simulation.java
Normal file
57
java/walking-robot-simulation.java
Normal file
|
@ -0,0 +1,57 @@
|
|||
import java.util.HashSet;
|
||||
|
||||
class Solution {
|
||||
private static final int TURN_LEFT = -2;
|
||||
private static final int TURN_RIGHT = -1;
|
||||
|
||||
private record Vec(int x, int y) {
|
||||
public Vec turnLeft() {
|
||||
return new Vec(-y, x);
|
||||
}
|
||||
|
||||
public Vec turnRight() {
|
||||
return new Vec(y, -x);
|
||||
}
|
||||
|
||||
public Vec add(Vec other) {
|
||||
return new Vec(x + other.x, y + other.y);
|
||||
}
|
||||
|
||||
public int distance() {
|
||||
return Math.abs(x * x + y * y);
|
||||
}
|
||||
}
|
||||
|
||||
public int robotSim(int[] commands, int[][] obstacles) {
|
||||
int maxDistance = 0;
|
||||
|
||||
// Process obstacles
|
||||
var uniqueObstacles = new HashSet<Vec>();
|
||||
for (int[] obstacle : obstacles) {
|
||||
uniqueObstacles.add(new Vec(obstacle[0], obstacle[1]));
|
||||
}
|
||||
|
||||
var pos = new Vec(0, 0);
|
||||
var direction = new Vec(0, 1);
|
||||
|
||||
for (int command : commands) {
|
||||
if (command == TURN_LEFT) {
|
||||
direction = direction.turnLeft();
|
||||
} else if (command == TURN_RIGHT) {
|
||||
direction = direction.turnRight();
|
||||
}
|
||||
|
||||
for (var steps = 0; steps < command; ++steps) {
|
||||
var next = pos.add(direction);
|
||||
if (uniqueObstacles.contains(next)) {
|
||||
break;
|
||||
}
|
||||
|
||||
pos = next;
|
||||
maxDistance = Math.max(maxDistance, pos.distance());
|
||||
}
|
||||
}
|
||||
|
||||
return maxDistance;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue