力扣289(java)-生命游戏(中等)
题目:
根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 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)-生命游戏(中等)的更多相关文章
- 力扣Leetcode 45. 跳跃游戏 II - 贪心思想
这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...
- [Leetcode] 第289题 生命游戏
一.题目描述 根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有一个初 ...
- Leetcode力扣45题 跳跃游戏 II
原题目: 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: ...
- 力扣:二叉树着色游戏(DFS详解)
有两位极客玩家参与了一场「二叉树着色」的游戏.游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同. 游戏从「一号」玩家开始(「一号 ...
- 力扣Leetcode 55. 跳跃游戏
跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...
- Java实现 LeetCode 289 生命游戏
289. 生命游戏 根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有 ...
- 生命游戏/Game of Life的Java实现(转)
首先简单介绍一下<生命游戏> 生命游戏其实是一个零玩家游戏.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死 ...
- 生命游戏 Java
本程序由四个类组成:其中Init_data,用于初始化各个活细胞的状态judge_state,用于判断下一代的细胞状态,并进行更新.set_color,用于给GUI界面中各个细胞涂色set_frame ...
- 生命游戏/Game of Life的Java实现
首先简单介绍一下<生命游戏> 生命游戏其实是一个零玩家游戏.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死 ...
- 实用---生命游戏 Java
本程序由四个类组成: 其中Init_data,用于初始化各个活细胞的状态judge_state,用于判断下一代的细胞状态,并进行更新.set_color,用于给GUI界面中各个细胞涂色set_fram ...
随机推荐
- 17_详解YUV
本文的主角是多媒体领域非常重要的一个概念:YUV. 简介 YUV,是一种颜色编码方法,跟RGB是同一个级别的概念,广泛应用于多媒体领域中. 也就是说,图像中每1个像素的颜色信息,除了可以用RGB的方式 ...
- VR汽车虚拟仿真的实现、应用和未来
汽车虚拟仿真技术是一种利用计算机模拟汽车运行的技术,以实现对汽车行为的分析.评估和改进.汽车虚拟仿真技术是汽车工业中重要的开发设计和测试工具,可以大大缩短产品研发周期.降低研发成本和提高产品质量.本文 ...
- (3)安装完python之后需要安装的Spyder集成开发环境教程
步骤一: 首先,在网站上下载你所需要的压缩文件,网址为https://files.pythonhosted.org/packages/5e/a0/ab7f29e32479d15663eab9afd1d ...
- 记录--JS-SDK页面打开提示realAuthUrl错误
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 测试环境好好地功能,上了生产,莫名其妙报错,开始以为是没有设置Js安全接口域名,结果让相应人员一查,已经设置了相应的域名,再看下公众号内的 ...
- 从零开始学Spring Boot系列-集成Kafka
Kafka简介 Apache Kafka是一个开源的分布式流处理平台,由LinkedIn公司开发和维护,后来捐赠给了Apache软件基金会.Kafka主要用于构建实时数据管道和流应用.它类似于一个分布 ...
- Python 如何通过网易163邮箱自动发送邮件
一.发送邮件的前提是必须开通发件服务器获取对应授权密码. 二.对应代码如下所示 import smtplib from email.mime.text import MIMEText from ema ...
- C#人脸对比服务(基于虹软人脸识别SDKV4.1封装)
软件截图 项目截图 部分代码 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- vue项目,关闭eslint语法检测
vue.config.js文件中 module.exports = { lintOnSave:false //关闭语法检查 } 然后重启项目生效!
- bram_to_vid
Entity: bram_to_vid File: bram_to_vid.v Diagram Description Company: Fpga Publish Engineer: FP Revis ...
- markdown 常用表情符号 (github emoji)
markdown 常用表情(emoji) 官网[非笔者维护,仅做引用] Face Smiling 咧嘴笑 grinning 汗颜笑 sweat_smile 爆笑 rofl 眨眼笑 wink innoc ...