Skip to content

Commit b5a1611

Browse files
aQuaaQua
aQua
authored and
aQua
committed
289 finish
1 parent a0760da commit b5a1611

File tree

2 files changed

+25
-19
lines changed

2 files changed

+25
-19
lines changed

Algorithms/0289.game-of-life/README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,18 @@ Follow up:
2020

2121

2222
## 解题思路
23+
这道题是有名的康威生命游戏, 这是一种细胞自动机,每一个位置有两种状态,1为活细胞,0为死细胞,对于每个位置都满足如下的条件:
2324

24-
见程序注释
25+
1. 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡
26+
2. 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活
27+
3. 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡
28+
4. 如果死细胞周围正好有三个活细胞,则该位置死细胞复活
29+
30+
由于题目中要求我们用置换方法in-place来解题,所以我们就不能新建一个相同大小的数组,那么我们只能更新原有数组,但是题目中要求所有的位置必须被同时更新,但是在循环程序中我们还是一个位置一个位置更新的,那么当一个位置更新了,这个位置成为其他位置的neighbor时,我们怎么知道其未更新的状态呢,我们可以使用状态机转换:
31+
32+
- 状态0: 死细胞转为死细胞
33+
- 状态1: 活细胞转为活细胞
34+
- 状态2: 活细胞转为死细胞
35+
- 状态3: 死细胞转为活细胞
36+
37+
最后我们对所有状态对2取余,那么状态0和2就变成死细胞,状态1和3就是活细胞,达成目的。我们先对原数组进行逐个扫描,对于每一个位置,扫描其周围八个位置,如果遇到状态1或2,就计数器累加1,扫完8个邻居,如果少于两个活细胞或者大于三个活细胞,而且当前位置是活细胞的话,标记状态2,如果正好有三个活细胞且当前是死细胞的话,标记状态3。完成一遍扫描后再对数据扫描一遍,对2取余变成我们想要的结果。

Algorithms/0289.game-of-life/game-of-life.go

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,34 @@ func gameOfLife(board [][]int) {
1111
return
1212
}
1313

14-
old := make([][]int, m)
15-
for i := 0; i < m; i++ {
16-
old[i] = make([]int, n)
17-
copy(old[i], board[i])
18-
}
19-
20-
check := func(i, j int) int {
14+
check := func(i, j int) {
2115
count := 0
2216
for r := i - 1; r <= i+1; r++ {
2317
for c := j - 1; c <= j+1; c++ {
2418
if 0 <= r && r < m && 0 <= c && c < n &&
2519
!(r == i && c == j) &&
26-
old[r][c] == 1 {
20+
(board[r][c] == 1 || board[r][c] == 2) {
2721
count++
2822
}
2923
}
3024
}
3125

32-
if old[i][j] == 1 {
33-
if count < 2 || count > 3 {
34-
return 0
35-
}
36-
return 1
26+
if board[i][j] == 1 && (count < 2 || count > 3) {
27+
board[i][j] = 2
28+
} else if board[i][j] == 0 && count == 3 {
29+
board[i][j] = 3
3730
}
31+
}
3832

39-
if count == 3 {
40-
return 1
33+
for i := 0; i < m; i++ {
34+
for j := 0; j < n; j++ {
35+
check(i, j)
4136
}
42-
43-
return 0
4437
}
4538

4639
for i := 0; i < m; i++ {
4740
for j := 0; j < n; j++ {
48-
board[i][j] = check(i, j)
41+
board[i][j] %= 2
4942
}
5043
}
5144
}

0 commit comments

Comments
 (0)