题目:

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

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

如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。

提示:

m == board.length
n == board[i].length
1 <= m, n <= 25
board[i][j] 为 0 或 1
 进阶:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/game-of-life
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

一、

1.创建一个新数组,将原数组复制到新数组中用于变换,新数组用于更新;

2.遍历当前细胞周围的八个元素,统计活细胞的数量;

3.根据规则更新原数组中细胞状态。

代码:

 1 class Solution {
2 public void gameOfLife(int[][] board) {
3 int m = board.length;
4 int n = board[0].length;
5 //使用一个数组,表示周围数的坐标与当前坐标的关系
6 int[] neighbors = {-1, 0, 1};
7 //复制数组
8 int[][] board2 = new int[m][n];
9 //将原数组复制到新数组
10 for(int i=0; i < m; i++){
11 for(int j=0; j < n; j++){
12 board2[i][j] = board[i][j];
13 }
14 }
15 //循环每个格子
16 for(int row = 0; row < m; row++){
17 for(int col = 0; col < n; col++){
18 int livenums = 0;
19
20 //计算出周围的数的坐标
21 for(int i=0; i < 3; i++){
22 for(int j=0; j< 3; j++){
23 if(!(neighbors[i] == 0 && neighbors[j] == 0)){
24 int r = row + neighbors[i];
25 int c = col + neighbors[j];
26 if((r >= 0 && r < m) && (c >= 0 && c < n) && board2[r][c] == 1){
27 livenums += 1;
28 }
29 }
30 }
31 }
32 //规则1和3
33 if((board2[row][col]) == 1 && (livenums < 2 || livenums > 3)){
34 board[row][col] = 0;
35 }
36 //规则4
37 if((board2[row][col]) == 0 && (livenums == 3)){
38 board[row][col] = 1;
39 }
40 }
41 }
42
43 }
44 }

 二、

使用复合状态

规则1:活细胞周围的 livenums <2 ,将细胞值改为  -1,代表细胞过去是活的现在死了;

规则2:活细胞周围的 livenums为2或者3,细胞值不变仍为1;

规则3:活细胞周围的 livenums > 3,将细胞值改为 -1,代表细胞过去是活的现在死了;

规则4:死细胞周围的 livenums = 3,将细胞值改为2,代表细胞过去是死的现在活了;

1.先遍历数组中的细胞;

2.遍历当前细胞周围的八个元素,如果细胞值的绝对值为1,则在活细胞数量上加1;

3.再次遍历数组,将board中的元素状态值改为0,1的形式,将状态值为-1的值改为0,为状态值为2的值改为1。

代码:

 1 class Solution {
2 public void gameOfLife(int[][] board) {
3 int m = board.length;
4 int n = board[0].length;
5 //使用一个数组,表示周围数的坐标与当前坐标的关系
6 int[] neighbors = {-1, 0, 1};
7 //循环每个格子
8 for(int row = 0; row < m; row++){
9 for(int col = 0; col < n; col++){
10 int livenums = 0;
11
12 //计算出周围的数的坐标
13 for(int i = 0; i < 3; i++){
14 for(int j = 0; j< 3; j++){
15 if(!(neighbors[i] == 0 && neighbors[j] == 0)){
16 int r = row + neighbors[i];
17 int c = col + neighbors[j];
18 if ((r >= 0 && r < m) && (c >= 0 && c < n) && (Math.abs(board[r][c]) == 1)){
19 livenums += 1;
20 }
21 }
22 }
23 }
24 //规则1和3
25 if((board[row][col]) == 1 && (livenums < 2 || livenums > 3)){
26 board[row][col] = -1;
27 }
28 //规则4
29 if((board[row][col]) == 0 && (livenums == 3)){
30 board[row][col] = 2;
31 }
32 }
33 }
34 for(int i=0; i < m; i++){
35 for(int j=0; j < n; j++){
36 if(board[i][j] > 0){
37 board[i][j] = 1;
38 }else{
39 board[i][j] = 0;
40 }
41 }
42 }
43
44 }
45 }

力扣289(java)-生命游戏(中等)的更多相关文章

  1. 力扣Leetcode 45. 跳跃游戏 II - 贪心思想

    这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...

  2. [Leetcode] 第289题 生命游戏

    一.题目描述 根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有一个初 ...

  3. Leetcode力扣45题 跳跃游戏 II

    原题目: 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: ...

  4. 力扣:二叉树着色游戏(DFS详解)

    有两位极客玩家参与了一场「二叉树着色」的游戏.游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同. 游戏从「一号」玩家开始(「一号 ...

  5. 力扣Leetcode 55. 跳跃游戏

    跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...

  6. Java实现 LeetCode 289 生命游戏

    289. 生命游戏 根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有 ...

  7. 生命游戏/Game of Life的Java实现(转)

    首先简单介绍一下<生命游戏> 生命游戏其实是一个零玩家游戏.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死 ...

  8. 生命游戏 Java

    本程序由四个类组成:其中Init_data,用于初始化各个活细胞的状态judge_state,用于判断下一代的细胞状态,并进行更新.set_color,用于给GUI界面中各个细胞涂色set_frame ...

  9. 生命游戏/Game of Life的Java实现

    首先简单介绍一下<生命游戏> 生命游戏其实是一个零玩家游戏.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死 ...

  10. 实用---生命游戏 Java

    本程序由四个类组成: 其中Init_data,用于初始化各个活细胞的状态judge_state,用于判断下一代的细胞状态,并进行更新.set_color,用于给GUI界面中各个细胞涂色set_fram ...

随机推荐

  1. 基于stm32H730的解决方案开发之freertos系统解析

    一 概述 在嵌入式小系统领域,freertos是一个非常厉害的角色.它和小芯片结合,能迸发出非常大的威力.这里在H730上使用了这个freertos,是应该做一个总结和备忘. 二 实例解析 1 线程初 ...

  2. (二)Linux环境的学习环境的搭建

    Xshell的安装和连接 由于我们打算通过Xshell进行命令的输入,就不再进行VMWARE-TOOLS的安装. 我们直接进行安装Xshell 并开始连接我们创建的创建的虚拟机 我们可以通过Xshel ...

  3. py文件读写

    ''' 1.文件打开 open(文件名,模式) 2.文件关闭filename.close() 模式: 1.r 文件读,指针默认在文件开头 2.w 文件写,指针默认在开头 若有文件,则打开时写入覆盖原文 ...

  4. vscode远程登陆免密码

    A,B双方通信,A想向B发送信息,又不想让别人知道,使用非对称加密:若A向B发送信息,A需要知道B的公钥简称B-pub,用B-pub加密信息后 发送给B,B再用自己的私钥B-prv解密出信息. A想验 ...

  5. FFmpeg命令行之ffmpeg

    一.简述 ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑.有了它,我们就可以对媒体文件做很多我们想做的 ...

  6. 记录--啊?Vue是有三种路由模式的?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 众所周知,vue路由模式常见的有 history 和 hash 模式,但其实还有一种方式-abstract模式(了解一哈~) 别急,本文我 ...

  7. pycharm 常见易错的PEP8规范

    PEP8规范 ( Python Enhancement Proposal ) PEP 8: E231 missing whitespace after ','这个意思是逗号后面要有一个空格 PEP 8 ...

  8. Error in beforeDestroy hook: “Error: [ElementForm]unpected width “found in

    吹水,可忽略 当我尝试吧el-form中labelWidth设为auto时,刷新页面获取到了上面的错误 百思不得其解,我貌似没有在beforeDestroy进行操作,为何会报这个错误 果断各种百度,G ...

  9. KingbaseES 表中隐藏字段说明

    在KingbaseES中,当我们创建一个数据表时,数据库会隐式增加几个系统字段.这些字段由系统进行维护,用户一般不会感知它们的存在. 例如,以下语句创建了一个简单的表: create table te ...

  10. KingbaseES V8R6 Deallocate 语句使用说明

    用途 DEALLOCATE被用来释放一个之前PREPARE好的SQL语句.如果不显式地释放一个PREPARE语句,那么会话结束时会释放它. prepare语句类似oracle的绑定变量 绑定过程: 1 ...