• leetcode刷题笔记289题 生命游戏


    leetcode刷题笔记289题 生命游戏

    源地址:289. 生命游戏

    问题描述:

    根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。

    给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

    如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
    如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
    如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
    如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
    根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。

    示例:

    输入:
    [
    [0,1,0],
    [0,0,1],
    [1,1,1],
    [0,0,0]
    ]
    输出:
    [
    [0,0,0],
    [1,0,1],
    [0,1,1],
    [0,1,0]
    ]

    进阶:

    你可以使用原地算法解决本题吗?请注意,面板上所有格子需要同时被更新:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。
    本题中,我们使用二维数组来表示面板。原则上,面板是无限的,但当活细胞侵占了面板边界时会造成问题。你将如何解决这些问题?

    //由于题目要求需要在原地处理 利用原数据使用一位保存,将数组中int数的第二位作为新状态标记,待全部处理完后将二维数组中所有元素进行右移移位即可
    object Solution {
        def gameOfLife(board: Array[Array[Int]]): Unit = {
            if (board.length == 0 || board(0).length == 0) return
            val row = board.length
            val col = board(0).length
            //定义访问的8个邻居的位置
            val xArr = Array[Int](0, 0, 1, 1, 1, -1, -1, -1)
            val yArr = Array[Int](1, -1, 0, 1, -1, 0, 1, -1)
    
            for (i <- 0 to row-1) {
                for (j <- 0 to col-1) {
                    //记录邻居的活细胞
                    var live = 0
                    for (k <- 0 to 7) {
                        val nx = i + xArr(k)
                        val ny = j + yArr(k)
                        //检查是否合法
                        if (nx >= 0 && nx < row && ny >= 0 && ny < col) {
                            //只需统计最后一位
                            live += board(nx)(ny)&1
                        }
                    }
                    var cur = board(i)(j)&1
                    var next = 0
                    //判断下个状态
                    if (cur == 1){
                        if (live < 2 || live > 3) next = 0
                        else next = 1 
                    } else {
                        if (live == 3) next = 1
                        else next = 0
                    }
                    board(i)(j) |= next << 1
                }
            }
    		//全部右移一位
            for (i <- 0 to row-1) {
                for (j <- 0  to col-1) {
                    board(i)(j) >>= 1
                }
            }
        }
    }
    
  • 相关阅读:
    CSS3 页面跳转的动画效果
    JS/React 判断对象是否为空对象
    React 根据官方总结的规范
    ckeditor字数限制
    swfobject.js IE兼容问题
    Jcrop 做图片剪裁 在IE中无法显示问题解决办法
    WebApp 中用 hashchange 做路由解析
    全国省市区Json文件 ,做省市区联动很轻松
    解决用友U8删除用户时提示“用户已启用”不能删除的问题
    CFUpdate高速模式下出现Error #2038提示的解决方案
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13984245.html
Copyright © 2020-2023  润新知