-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRobot.cpp
More file actions
102 lines (79 loc) · 3.5 KB
/
Robot.cpp
File metadata and controls
102 lines (79 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// A width x height grid is on an XY-plane with the bottom-left cell at (0, 0) and the top-right cell at (width - 1, height - 1). The grid is aligned with the four cardinal directions ("North", "East", "South", and "West"). A robot is initially at cell (0, 0) facing direction "East".
// The robot can be instructed to move for a specific number of steps. For each step, it does the following.
// Attempts to move forward one cell in the direction it is facing.
// If the cell the robot is moving to is out of bounds, the robot instead turns 90 degrees counterclockwise and retries the step.
// After the robot finishes moving the number of steps required, it stops and awaits the next instruction.
// Implement the Robot class:
// Robot(int width, int height) Initializes the width x height grid with the robot at (0, 0) facing "East".
// void step(int num) Instructs the robot to move forward num steps.
// int[] getPos() Returns the current cell the robot is at, as an array of length 2, [x, y].
// String getDir() Returns the current direction of the robot, "North", "East", "South", or "West".
// Example 1:
// example-1
// Input
// ["Robot", "step", "step", "getPos", "getDir", "step", "step", "step", "getPos", "getDir"]
// [[6, 3], [2], [2], [], [], [2], [1], [4], [], []]
// Output
// [null, null, null, [4, 0], "East", null, null, null, [1, 2], "West"]
// Explanation
// Robot robot = new Robot(6, 3); // Initialize the grid and the robot at (0, 0) facing East.
// robot.step(2); // It moves two steps East to (2, 0), and faces East.
// robot.step(2); // It moves two steps East to (4, 0), and faces East.
// robot.getPos(); // return [4, 0]
// robot.getDir(); // return "East"
// robot.step(2); // It moves one step East to (5, 0), and faces East.
// // Moving the next step East would be out of bounds, so it turns and faces North.
// // Then, it moves one step North to (5, 1), and faces North.
// robot.step(1); // It moves one step North to (5, 2), and faces North (not West).
// robot.step(4); // Moving the next step North would be out of bounds, so it turns and faces West.
// // Then, it moves four steps West to (1, 2), and faces West.
// robot.getPos(); // return [1, 2]
// robot.getDir(); // return "West"
// Constraints:
// 2 <= width, height <= 100
// 1 <= num <= 105
// At most 104 calls in total will be made to step, getPos, and getDir.
class Robot {
public:
int w, h;
int x, y;
int dir; // 0=East, 1=North, 2=West, 3=South
int perimeter;
vector<string> directions = {"East", "North", "West", "South"};
Robot(int width, int height) {
w = width;
h = height;
x = 0;
y = 0;
dir = 0; // East
perimeter = 2 * (w + h) - 4;
}
void step(int num) {
num %= perimeter;
// Special case: if num == 0, robot completes full cycle
if (num == 0 && perimeter > 0) {
num = perimeter;
}
while (num--) {
int nx = x, ny = y;
if (dir == 0) nx++;
else if (dir == 1) ny++;
else if (dir == 2) nx--;
else ny--;
// If out of bounds → turn and retry
if (nx < 0 || nx >= w || ny < 0 || ny >= h) {
dir = (dir + 1) % 4;
num++; // retry this step
} else {
x = nx;
y = ny;
}
}
}
vector<int> getPos() {
return {x, y};
}
string getDir() {
return directions[dir];
}
};