41 lines
785 B
Go
41 lines
785 B
Go
package q289
|
|
|
|
func countLiveNeighbors(board [][]int, row, col int) int {
|
|
cnt := 0
|
|
for r := row - 1; r <= row+1; r++ {
|
|
for c := col - 1; c <= col+1; c++ {
|
|
if r == row && c == col || r < 0 || c < 0 || r >= len(board) || c >= len(board[0]) {
|
|
continue
|
|
}
|
|
cnt += board[r][c] & 1
|
|
}
|
|
}
|
|
return cnt
|
|
}
|
|
|
|
func gameOfLife(board [][]int) {
|
|
for r := range board {
|
|
for c := range board[r] {
|
|
neighbors := countLiveNeighbors(board, r, c)
|
|
if board[r][c]&1 == 1 {
|
|
switch {
|
|
case neighbors < 2 || neighbors > 3:
|
|
// die
|
|
default:
|
|
board[r][c] |= 2 // survive
|
|
}
|
|
} else if neighbors == 3 {
|
|
board[r][c] |= 2 // birth
|
|
}
|
|
}
|
|
}
|
|
|
|
// Next generation
|
|
for r := range board {
|
|
for c := range board[r] {
|
|
board[r][c] >>= 1
|
|
}
|
|
}
|
|
}
|
|
|
|
var _ = gameOfLife
|