---
# System prepended metadata

title: Leetcode 289. Game of Life

---

# Leetcode 289. Game of Life

## 題解

### Use Extra Memoery to evulate the cell

```python!
from copy import deepcopy

class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        # Time complexity: O(m*n)
        # Space complexity: O(m*n)
        m,n = len(board),len(board[0])
        temp = deepcopy(board)
        directions = [[0,-1],[1,0],[-1,0],[0,1],[-1,-1],[1,-1],[-1,1],[1,1]]
        for y in range(m):
            for x in range(n):
                cells = 0
                for _x,_y in directions:
                    new_x = x + _x
                    new_y = y + _y
                    if 0 <= new_x < n and 0 <= new_y < m:
                        cell = temp[new_y][new_x]
                        if cell == 1:
                            cells += 1
                if cells == 3:
                    board[y][x] = 1
                elif cells < 2 or cells > 3:
                    board[y][x] = 0

        # 3 -> 1
        # 2 -> no action
        # < 2 -> 0
        # > 3 -> 0
```

### Space Complexity O(1)

<iframe width="100%" height="500" src="https://www.youtube.com/embed/fei4bJQdBUQ?si=s6lqe9L6JnUuqKct" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

```python!
from copy import deepcopy

class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        # Time complexity: O(m*n)
        # Space complexity: O(1)
        m,n = len(board),len(board[0])
        directions = [[0,-1],[1,0],[-1,0],[0,1],[-1,-1],[1,-1],[-1,1],[1,1]]
        for y in range(m):
            for x in range(n):
                cells = 0
                for _x,_y in directions:
                    new_x = x + _x
                    new_y = y + _y
                    if 0 <= new_x < n and 0 <= new_y < m:
                        cell = board[new_y][new_x]
                        if cell in [1,3]: # 只有 1 需要被視為活著的細胞
                            cells += 1
                if board[y][x]: # 如果為 1
                    if cells in [2,3]: # 保持狀態
                        board[y][x] = 3
                elif cells == 3: # 如果為 0 並且細胞需要再生
                    board[y][x] = 2
                # 其他狀態不需要管 1 -> 0 先視為 1 ，以便計算活著的細胞，0 -> 0 也不需要管
        # 轉換狀態
        for y in range(m):
            for x in range(n):
                if board[y][x] == 1:
                    board[y][x] = 0
                elif board[y][x] in [2,3]:
                    board[y][x] = 1

        # 3 -> 1
        # 2 -> no action
        # < 2 -> 0
        # > 3 -> 0
           
        # origin transfrom -> replace
        # 0 0 -> 0
        # 1 0 -> 1 # 0b10 => 2
        # 0 1 -> 2 # 0b01 => 1
        # 1 1 -> 3
```