Skip to content

Commit a10cebc

Browse files
authored
Merge pull request #125 from NovaHe/feature/874
feature/874: add 874 solution
2 parents 5f6ea09 + 1835b6d commit a10cebc

File tree

3 files changed

+201
-0
lines changed

3 files changed

+201
-0
lines changed
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
# [875. Koko Eating Bananas](https://leetcode.com/problems/walking-robot-simulation/)
2+
3+
4+
## 题目
5+
6+
A robot on an infinite XY-plane starts at point `(0, 0)` and faces north. The robot can receive one of three possible types of `commands`:
7+
8+
- `-2`: turn left `90` degrees,
9+
- `-1`: turn right `90` degrees, or
10+
- `1 <= k <= 9`: move forward `k` units.
11+
12+
Some of the grid squares are `obstacles`. The `ith` obstacle is at grid point `obstacles[i] = (xi, yi)`.
13+
14+
If the robot would try to move onto them, the robot stays on the previous grid square instead (but still continues following the rest of the route.)
15+
16+
Return *the maximum Euclidean distance that the robot will be from the origin **squared** (i.e. if the distance is* `5`*, return* `25`*)*.
17+
18+
**Note:**
19+
20+
- North means +Y direction.
21+
- East means +X direction.
22+
- South means -Y direction.
23+
- West means -X direction.
24+
25+
26+
27+
**Example 1:**
28+
29+
```
30+
Input: commands = [4,-1,3], obstacles = []
31+
Output: 25
32+
Explanation: The robot starts at (0, 0):
33+
1. Move north 4 units to (0, 4).
34+
2. Turn right.
35+
3. Move east 3 units to (3, 4).
36+
The furthest point away from the origin is (3, 4), which is 32 + 42 = 25 units away.
37+
```
38+
39+
**Example 2:**
40+
41+
```
42+
Input: commands = [4,-1,4,-2,4], obstacles = [[2,4]]
43+
Output: 65
44+
Explanation: The robot starts at (0, 0):
45+
1. Move north 4 units to (0, 4).
46+
2. Turn right.
47+
3. Move east 1 unit and get blocked by the obstacle at (2, 4), robot is at (1, 4).
48+
4. Turn left.
49+
5. Move north 4 units to (1, 8).
50+
The furthest point away from the origin is (1, 8), which is 12 + 82 = 65 units away.
51+
```
52+
53+
54+
55+
**Constraints:**
56+
57+
- `1 <= commands.length <= 104`
58+
- `commands[i]` is one of the values in the list `[-2,-1,1,2,3,4,5,6,7,8,9]`.
59+
- `0 <= obstacles.length <= 104`
60+
- `-3 * 104 <= xi, yi <= 3 * 104`
61+
- The answer is guaranteed to be less than `231`.
62+
63+
64+
## 题目大意
65+
66+
67+
机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令 commands :
68+
69+
70+
-2 :向左转 90 度
71+
-1 :向右转 90 度
72+
1 <= x <= 9 :向前移动 x 个单位长度
73+
74+
75+
在网格上有一些格子被视为障碍物 obstacles 。第 i 个障碍物位于网格点 obstacles[i] = (xi, yi) 。
76+
77+
机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,但仍然可以继续尝试进行该路线的其余部分。
78+
79+
返回从原点到机器人所有经过的路径点(坐标为整数)的最大欧式距离的平方。(即,如果距离为 5 ,则返回 25 )
80+
81+
示例 1:
82+
输入:commands = [4,-1,3], obstacles = []
83+
输出:25
84+
解释:
85+
机器人开始位于 (0, 0):
86+
1. 向北移动 4 个单位,到达 (0, 4)
87+
2. 右转
88+
3. 向东移动 3 个单位,到达 (3, 4)
89+
距离原点最远的是 (3, 4) ,距离为 32 + 42 = 25
90+
91+
示例 2:
92+
输入:commands = [4,-1,4,-2,4], obstacles = [[2,4]]
93+
输出:65
94+
解释:机器人开始位于 (0, 0):
95+
1. 向北移动 4 个单位,到达 (0, 4)
96+
2. 右转
97+
3. 向东移动 1 个单位,然后被位于 (2, 4) 的障碍物阻挡,机器人停在 (1, 4)
98+
4. 左转
99+
5. 向北走 4 个单位,到达 (1, 8)
100+
距离原点最远的是 (1, 8) ,距离为 12 + 82 = 65
101+
102+
103+
提示:
104+
105+
- `1 <= commands.length <= 104`
106+
- `commands[i]` is one of the values in the list `[-2,-1,1,2,3,4,5,6,7,8,9]`.
107+
- `0 <= obstacles.length <= 104`
108+
- `-3 * 104 <= xi, yi <= 3 * 104`
109+
- The answer is guaranteed to be less than `231`.
110+
111+
112+
## 解题思路
113+
114+
这个题的难点在于,怎么用编程语言去描述机器人的行为
115+
可以用以下数据结构表达机器人的行为:
116+
```go
117+
direct:= 0 // direct表示机器人移动方向:0 1 2 3 4 (北东南西),默认朝北
118+
x, y := 0, 0 // 表示当前机器人所在横纵坐标位置,默认为(0,0)
119+
directX := []int{0, 1, 0, -1}
120+
directY := []int{1, 0, -1, 0}
121+
// 组合directX directY和direct,表示机器人往某一个方向移动
122+
nextX := x + directX[direct]
123+
nextY := y + directY[direct]
124+
其他代码按照题意翻译即可
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package leetcode
2+
3+
func robotSim(commands []int, obstacles [][]int) int {
4+
m := make(map[[2]int]struct{})
5+
for _, v := range obstacles {
6+
if len(v) != 0 {
7+
m[[2]int{v[0], v[1]}] = struct{}{}
8+
}
9+
}
10+
directX := []int{0, 1, 0, -1}
11+
directY := []int{1, 0, -1, 0}
12+
direct, x, y := 0, 0, 0
13+
result := 0
14+
for _, c := range commands {
15+
if c == -2 {
16+
direct = (direct + 3) % 4
17+
continue
18+
}
19+
if c == -1 {
20+
direct = (direct + 1) % 4
21+
continue
22+
}
23+
for ; c > 0; c-- {
24+
nextX := x + directX[direct]
25+
nextY := y + directY[direct]
26+
if _, ok := m[[2]int{nextX, nextY}]; ok {
27+
break
28+
}
29+
tmpResult := nextX*nextX + nextY*nextY
30+
if tmpResult > result {
31+
result = tmpResult
32+
}
33+
x = nextX
34+
y = nextY
35+
}
36+
}
37+
return result
38+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package leetcode
2+
3+
import "testing"
4+
5+
func Test_robotSim(t *testing.T) {
6+
type args struct {
7+
commands []int
8+
obstacles [][]int
9+
}
10+
cases := []struct {
11+
name string
12+
args args
13+
want int
14+
}{
15+
{
16+
"case 1",
17+
args{
18+
commands: []int{4, -1, 3},
19+
obstacles: [][]int{{}},
20+
},
21+
25,
22+
},
23+
{
24+
"case 2",
25+
args{
26+
commands: []int{4, -1, 4, -2, 4},
27+
obstacles: [][]int{{2, 4}},
28+
},
29+
65,
30+
},
31+
}
32+
for _, tt := range cases {
33+
t.Run(tt.name, func(t *testing.T) {
34+
if got := robotSim(tt.args.commands, tt.args.obstacles); got != tt.want {
35+
t.Errorf("robotSim() = %v, want %v", got, tt.want)
36+
}
37+
})
38+
}
39+
}

0 commit comments

Comments
 (0)