Skip to content

Commit d54f49e

Browse files
authored
feat: add solutions to lcci problem: No.1622 (#1339)
No.16.22.Langtons Ant
1 parent 0cf8c9c commit d54f49e

File tree

6 files changed

+513
-3
lines changed

6 files changed

+513
-3
lines changed

lcci/16.22.Langtons Ant/README.md

+188-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
## 题目描述
66

77
<!-- 这里写题目描述 -->
8+
89
<p>一只蚂蚁坐在由白色和黑色方格构成的无限网格上。开始时,网格全白,蚂蚁面向右侧。每行走一步,蚂蚁执行以下操作。</p>
910
<p>(1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并向前移动一个单位。<br>
1011
(2) 如果在黑色方格上,则翻转方格的颜色,向左(逆时针方向)转 90 度,并向前移动一个单位。</p>
@@ -35,19 +36,204 @@
3536
<ul>
3637
<li><code>K &lt;= 100000</code></li>
3738
</ul>
39+
3840
## 解法
41+
3942
<!-- 这里可写通用的实现逻辑 -->
43+
44+
**方法一:哈希表 + 模拟**
45+
46+
我们使用哈希表 $black$ 来记录所有黑色方格的位置,哈希表 $dirs$ 来记录蚂蚁的四个方向。我们使用变量 $x, y$ 来记录蚂蚁的位置,使用变量 $p$ 来记录蚂蚁的方向。我们使用变量 $x1, y1, x2, y2$ 来记录所有黑色方格的最小横坐标、最小纵坐标、最大横坐标、最大纵坐标。
47+
48+
我们模拟蚂蚁的行走过程。如果蚂蚁所在的方格是白色的,那么蚂蚁向右转 $90$ 度,将方格涂黑,向前移动一个单位。如果蚂蚁所在的方格是黑色的,那么蚂蚁向左转 $90$ 度,将方格涂白,向前移动一个单位。在模拟的过程中,我们不断更新 $x1, y1, x2, y2$ 的值,使得它们能够包含蚂蚁走过的所有方格。
49+
50+
模拟结束后,我们根据 $x1, y1, x2, y2$ 的值,构造出答案矩阵 $g$。然后,我们将蚂蚁所在的位置涂上蚂蚁的方向,同时将所有黑色方格涂上 $X$,最后返回答案矩阵。
51+
52+
时间复杂度 $O(K)$,空间复杂度 $O(K)$。其中 $K$ 是蚂蚁行走的步数。
53+
4054
<!-- tabs:start -->
55+
4156
### **Python3**
57+
4258
<!-- 这里可写当前语言的特殊实现逻辑 -->
59+
4360
```python
61+
class Solution:
62+
def printKMoves(self, K: int) -> List[str]:
63+
x1 = y1 = x2 = y2 = 0
64+
dirs = (0, 1, 0, -1, 0)
65+
d = "RDLU"
66+
x = y = 0
67+
p = 0
68+
black = set()
69+
for _ in range(K):
70+
if (x, y) in black:
71+
black.remove((x, y))
72+
p = (p + 3) % 4
73+
else:
74+
black.add((x, y))
75+
p = (p + 1) % 4
76+
x += dirs[p]
77+
y += dirs[p + 1]
78+
x1 = min(x1, x)
79+
y1 = min(y1, y)
80+
x2 = max(x2, x)
81+
y2 = max(y2, y)
82+
m, n = x2 - x1 + 1, y2 - y1 + 1
83+
g = [["_"] * n for _ in range(m)]
84+
for i, j in black:
85+
g[i - x1][j - y1] = "X"
86+
g[x - x1][y - y1] = d[p]
87+
return ["".join(row) for row in g]
88+
```
4489

45-
````
4690
### **Java**
91+
4792
<!-- 这里可写当前语言的特殊实现逻辑 -->
93+
4894
```java
95+
class Solution {
96+
public List<String> printKMoves(int K) {
97+
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
98+
int[] dirs = {0, 1, 0, -1, 0};
99+
String d = "RDLU";
100+
int x = 0, y = 0, p = 0;
101+
Set<List<Integer>> black = new HashSet<>();
102+
while (K-- > 0) {
103+
List<Integer> t = List.of(x, y);
104+
if (black.add(t)) {
105+
p = (p + 1) % 4;
106+
} else {
107+
black.remove(t);
108+
p = (p + 3) % 4;
109+
}
110+
x += dirs[p];
111+
y += dirs[p + 1];
112+
x1 = Math.min(x1, x);
113+
y1 = Math.min(y1, y);
114+
x2 = Math.max(x2, x);
115+
y2 = Math.max(y2, y);
116+
}
117+
int m = x2 - x1 + 1;
118+
int n = y2 - y1 + 1;
119+
char[][] g = new char[m][n];
120+
for (char[] row : g) {
121+
Arrays.fill(row, '_');
122+
}
123+
for (List<Integer> t : black) {
124+
int i = t.get(0) - x1;
125+
int j = t.get(1) - y1;
126+
g[i][j] = 'X';
127+
}
128+
g[x - x1][y - y1] = d.charAt(p);
129+
List<String> ans = new ArrayList<>();
130+
for (char[] row : g) {
131+
ans.add(String.valueOf(row));
132+
}
133+
return ans;
134+
}
135+
}
136+
```
137+
138+
### **C++**
139+
140+
```cpp
141+
class Solution {
142+
public:
143+
vector<string> printKMoves(int K) {
144+
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
145+
int dirs[5] = {0, 1, 0, -1, 0};
146+
string d = "RDLU";
147+
int x = 0, y = 0, p = 0;
148+
set<pair<int, int>> black;
149+
while (K--) {
150+
auto t = make_pair(x, y);
151+
if (black.count(t)) {
152+
black.erase(t);
153+
p = (p + 3) % 4;
154+
} else {
155+
black.insert(t);
156+
p = (p + 1) % 4;
157+
}
158+
x += dirs[p];
159+
y += dirs[p + 1];
160+
x1 = min(x1, x);
161+
y1 = min(y1, y);
162+
x2 = max(x2, x);
163+
y2 = max(y2, y);
164+
}
165+
int m = x2 - x1 + 1, n = y2 - y1 + 1;
166+
vector<string> g(m, string(n, '_'));
167+
for (auto& [i, j] : black) {
168+
g[i - x1][j - y1] = 'X';
169+
}
170+
g[x - x1][y - y1] = d[p];
171+
return g;
172+
}
173+
};
174+
```
175+
176+
### **Go**
177+
178+
```go
179+
func printKMoves(K int) []string {
180+
var x1, y1, x2, y2, x, y, p int
181+
dirs := [5]int{0, 1, 0, -1, 0}
182+
d := "RDLU"
183+
type pair struct{ x, y int }
184+
black := map[pair]bool{}
185+
for K > 0 {
186+
t := pair{x, y}
187+
if black[t] {
188+
delete(black, t)
189+
p = (p + 3) % 4
190+
} else {
191+
black[t] = true
192+
p = (p + 1) % 4
193+
}
194+
x += dirs[p]
195+
y += dirs[p+1]
196+
x1 = min(x1, x)
197+
y1 = min(y1, y)
198+
x2 = max(x2, x)
199+
y2 = max(y2, y)
200+
K--
201+
}
202+
m, n := x2-x1+1, y2-y1+1
203+
g := make([][]byte, m)
204+
for i := range g {
205+
g[i] = make([]byte, n)
206+
for j := range g[i] {
207+
g[i][j] = '_'
208+
}
209+
}
210+
for t := range black {
211+
i, j := t.x-x1, t.y-y1
212+
g[i][j] = 'X'
213+
}
214+
g[x-x1][y-y1] = d[p]
215+
ans := make([]string, m)
216+
for i := range ans {
217+
ans[i] = string(g[i])
218+
}
219+
return ans
220+
}
49221
50-
````
222+
func min(a, b int) int {
223+
if a < b {
224+
return a
225+
}
226+
return b
227+
}
228+
229+
func max(a, b int) int {
230+
if a > b {
231+
return a
232+
}
233+
return b
234+
235+
}
236+
```
51237

52238
### **...**
53239

lcci/16.22.Langtons Ant/README_EN.md

+167-1
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,179 @@
6464
### **Python3**
6565

6666
```python
67-
67+
class Solution:
68+
def printKMoves(self, K: int) -> List[str]:
69+
x1 = y1 = x2 = y2 = 0
70+
dirs = (0, 1, 0, -1, 0)
71+
d = "RDLU"
72+
x = y = 0
73+
p = 0
74+
black = set()
75+
for _ in range(K):
76+
if (x, y) in black:
77+
black.remove((x, y))
78+
p = (p + 3) % 4
79+
else:
80+
black.add((x, y))
81+
p = (p + 1) % 4
82+
x += dirs[p]
83+
y += dirs[p + 1]
84+
x1 = min(x1, x)
85+
y1 = min(y1, y)
86+
x2 = max(x2, x)
87+
y2 = max(y2, y)
88+
m, n = x2 - x1 + 1, y2 - y1 + 1
89+
g = [["_"] * n for _ in range(m)]
90+
for i, j in black:
91+
g[i - x1][j - y1] = "X"
92+
g[x - x1][y - y1] = d[p]
93+
return ["".join(row) for row in g]
6894
```
6995

7096
### **Java**
7197

7298
```java
99+
class Solution {
100+
public List<String> printKMoves(int K) {
101+
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
102+
int[] dirs = {0, 1, 0, -1, 0};
103+
String d = "RDLU";
104+
int x = 0, y = 0, p = 0;
105+
Set<List<Integer>> black = new HashSet<>();
106+
while (K-- > 0) {
107+
List<Integer> t = List.of(x, y);
108+
if (black.add(t)) {
109+
p = (p + 1) % 4;
110+
} else {
111+
black.remove(t);
112+
p = (p + 3) % 4;
113+
}
114+
x += dirs[p];
115+
y += dirs[p + 1];
116+
x1 = Math.min(x1, x);
117+
y1 = Math.min(y1, y);
118+
x2 = Math.max(x2, x);
119+
y2 = Math.max(y2, y);
120+
}
121+
int m = x2 - x1 + 1;
122+
int n = y2 - y1 + 1;
123+
char[][] g = new char[m][n];
124+
for (char[] row : g) {
125+
Arrays.fill(row, '_');
126+
}
127+
for (List<Integer> t : black) {
128+
int i = t.get(0) - x1;
129+
int j = t.get(1) - y1;
130+
g[i][j] = 'X';
131+
}
132+
g[x - x1][y - y1] = d.charAt(p);
133+
List<String> ans = new ArrayList<>();
134+
for (char[] row : g) {
135+
ans.add(String.valueOf(row));
136+
}
137+
return ans;
138+
}
139+
}
140+
```
141+
142+
### **C++**
143+
144+
```cpp
145+
class Solution {
146+
public:
147+
vector<string> printKMoves(int K) {
148+
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
149+
int dirs[5] = {0, 1, 0, -1, 0};
150+
string d = "RDLU";
151+
int x = 0, y = 0, p = 0;
152+
set<pair<int, int>> black;
153+
while (K--) {
154+
auto t = make_pair(x, y);
155+
if (black.count(t)) {
156+
black.erase(t);
157+
p = (p + 3) % 4;
158+
} else {
159+
black.insert(t);
160+
p = (p + 1) % 4;
161+
}
162+
x += dirs[p];
163+
y += dirs[p + 1];
164+
x1 = min(x1, x);
165+
y1 = min(y1, y);
166+
x2 = max(x2, x);
167+
y2 = max(y2, y);
168+
}
169+
int m = x2 - x1 + 1, n = y2 - y1 + 1;
170+
vector<string> g(m, string(n, '_'));
171+
for (auto& [i, j] : black) {
172+
g[i - x1][j - y1] = 'X';
173+
}
174+
g[x - x1][y - y1] = d[p];
175+
return g;
176+
}
177+
};
178+
```
73179
180+
### **Go**
181+
182+
```go
183+
func printKMoves(K int) []string {
184+
var x1, y1, x2, y2, x, y, p int
185+
dirs := [5]int{0, 1, 0, -1, 0}
186+
d := "RDLU"
187+
type pair struct{ x, y int }
188+
black := map[pair]bool{}
189+
for K > 0 {
190+
t := pair{x, y}
191+
if black[t] {
192+
delete(black, t)
193+
p = (p + 3) % 4
194+
} else {
195+
black[t] = true
196+
p = (p + 1) % 4
197+
}
198+
x += dirs[p]
199+
y += dirs[p+1]
200+
x1 = min(x1, x)
201+
y1 = min(y1, y)
202+
x2 = max(x2, x)
203+
y2 = max(y2, y)
204+
K--
205+
}
206+
m, n := x2-x1+1, y2-y1+1
207+
g := make([][]byte, m)
208+
for i := range g {
209+
g[i] = make([]byte, n)
210+
for j := range g[i] {
211+
g[i][j] = '_'
212+
}
213+
}
214+
for t := range black {
215+
i, j := t.x-x1, t.y-y1
216+
g[i][j] = 'X'
217+
}
218+
g[x-x1][y-y1] = d[p]
219+
ans := make([]string, m)
220+
for i := range ans {
221+
ans[i] = string(g[i])
222+
}
223+
return ans
224+
}
225+
226+
func min(a, b int) int {
227+
if a < b {
228+
return a
229+
}
230+
return b
231+
}
232+
233+
func max(a, b int) int {
234+
if a > b {
235+
return a
236+
}
237+
return b
238+
239+
}
74240
```
75241

76242
### **...**

0 commit comments

Comments
 (0)