生命游戏

61 阅读1分钟

题目链接:leetcode.cn/problems/ga…

题解

func gameOfLife(board [][]int) {
    for i := 0; i < len(board); i++ {
        for j := 0; j < len(board[0]); j++ {
            s := status(i, j, board)
            if board[i][j] < s {
                    board[i][j] = -1 // 定义复活状态为 -1
            }
            if board[i][j] > s {
                    board[i][j] = 2  // 定义死亡状态为 2
            }
        }
    }

    // 更新新状态,复活状态更新为 1;死亡状态更新为 0;
    for i := 0; i < len(board); i++ {
        for j := 0; j < len(board[0]); j++ {
            if board[i][j] == -1 {
                    board[i][j] = 1
            }
            if board[i][j] == 2 {
                    board[i][j] = 0
            }
        }
    }
}

func status(i, j int, board [][]int) int {
    var lives = oldStatus(board, i-1, j-1) + // 左上
            oldStatus(board, i-1, j) +       // 上 
            oldStatus(board, i-1, j+1) +     // 右上
            oldStatus(board, i, j-1) +       // 左 
            oldStatus(board, i, j+1) +       // 右
            oldStatus(board, i+1, j-1) +     // 左下
            oldStatus(board, i+1, j) +       // 下
            oldStatus(board, i+1, j+1)       // 右下

    if board[i][j] == 0 {
        // 如果死细胞周围正好有三个活细胞,则该位置死细胞复活
        if lives == 3 {
                return 1
        } else {
                return 0
        }
    } else {
        // 如果活细胞周围八个位置有少于2个或超过三个活细胞,则该位置活细胞死亡
        if lives < 2 || lives > 3 {
                return 0
        } else {
                return 1
        }
    }
}

// 获取位置 i,j 处细胞初始状态
func oldStatus(board [][]int, i, j int) int {
    if i < 0 || i >= len(board) {
            return 0
    }

    if j < 0 || j >= len(board[0]) {
            return 0
    }

    if board[i][j] == -1 { // 初始为死亡状态
            return 0
    }
    if board[i][j] == 2 {  // 初始为复活状态
            return 1
    }

    return board[i][j]
}

要点

  • 这道题应该是 Easy 的难度。注意题目中的同步更新的要求即可。