289.game-of-life.go 638 B

1234567891011121314151617181920212223242526
  1. func gameOfLife(board [][]int) {
  2. m, n := len(board), len(board[0])
  3. xDir := []int{1, 1, 0, -1, -1, -1, 0, 1}
  4. yDir := []int{0, -1, -1, -1, 0, 1, 1, 1}
  5. for y := 0; y < m; y++ {
  6. for x := 0; x < n; x++ {
  7. cnt := 0
  8. for i := 0; i < 8; i++ {
  9. xPos, yPos := x+xDir[i], y+yDir[i]
  10. if 0 <= xPos && xPos < n && 0 <= yPos && yPos < m {
  11. cnt += board[yPos][xPos] & 1
  12. }
  13. }
  14. if cnt == 2 { // Keep current state
  15. board[y][x] |= (board[y][x] & 1) << 1
  16. } else if cnt == 3 { // Live :-)
  17. board[y][x] |= 2
  18. } // Else, die X-(
  19. }
  20. }
  21. for y := 0; y < m; y++ {
  22. for x := 0; x < n; x++ {
  23. board[y][x] >>= 1
  24. }
  25. }
  26. }