生命游戏

leetcode 289. 生命游戏

  • 额外数组写法
func gameOfLife(board [][]int) {
	tmp := make([][]int, len(board))
	for i:=0;i<len(board);i++{
		tmp[i] = make([]int,len(board[i]))
		copy(tmp[i],board[i])
	}

	path := [8][2]int{{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}
	var live, x, y int

	for i := 0; i < len(board); i++ {
		for j := 0; j < len(board[i]); j++ {
			live = 0
			for _, p := range path {
				x, y = i+p[0], j+p[1]
				if x >= 0 && x < len(board) && y >= 0 && y < len(board[i]) {
					if tmp[x][y] == 1 {
						live++
					}
				}
			}
			// 判断周围是不是有三个活细胞
			if tmp[i][j] == 1 {
				if live < 2 || live > 3 {
					board[i][j] = 0
				}
			} else if live == 3 {
				board[i][j] = 1
			}
		}
	}
}
  • 原地写法
func gameOfLife(board [][]int) {
	m := len(board) 
    if m == 0 {
        return 
    }
    n := len(board[0])
    path := [8][2]int{{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}
    for i := 0 ;i<m;i++{
        for j := 0 ;j < n ;j++{
            for _,p:=range path{
                x,y := i+p[0],j+p[1]
                // 细胞周围原先是1的数量,奇数表示该位置原先是活的
                if x >=0 && x < m && y >=0 && y <n && board[x][y] % 2 == 1{
                    board[i][j]+=2
                }
            }
        }
    }
    for i := 0 ;i<m;i++{
        for j := 0 ;j < n ;j++{
            // 5 表示原先是活的,周围两个活得
            // 6 表示原先是死的,周围三个活得
            // 7 表示原先是活的,周围三个活得
            if board[i][j]>4 && board[i][j]<8{
                board[i][j]=1
            }else {
                board[i][j]=0
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值