File tree Expand file tree Collapse file tree 2 files changed +25
-19
lines changed
Algorithms/0289.game-of-life Expand file tree Collapse file tree 2 files changed +25
-19
lines changed Original file line number Diff line number Diff line change @@ -20,5 +20,18 @@ Follow up:
20
20
21
21
22
22
## 解题思路
23
+ 这道题是有名的康威生命游戏, 这是一种细胞自动机,每一个位置有两种状态,1为活细胞,0为死细胞,对于每个位置都满足如下的条件:
23
24
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取余变成我们想要的结果。
Original file line number Diff line number Diff line change @@ -11,41 +11,34 @@ func gameOfLife(board [][]int) {
11
11
return
12
12
}
13
13
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 ) {
21
15
count := 0
22
16
for r := i - 1 ; r <= i + 1 ; r ++ {
23
17
for c := j - 1 ; c <= j + 1 ; c ++ {
24
18
if 0 <= r && r < m && 0 <= c && c < n &&
25
19
! (r == i && c == j ) &&
26
- old [r ][c ] == 1 {
20
+ ( board [r ][c ] == 1 || board [ r ][ c ] == 2 ) {
27
21
count ++
28
22
}
29
23
}
30
24
}
31
25
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
37
30
}
31
+ }
38
32
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 )
41
36
}
42
-
43
- return 0
44
37
}
45
38
46
39
for i := 0 ; i < m ; i ++ {
47
40
for j := 0 ; j < n ; j ++ {
48
- board [i ][j ] = check ( i , j )
41
+ board [i ][j ] %= 2
49
42
}
50
43
}
51
44
}
You can’t perform that action at this time.
0 commit comments