力扣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 ...
随机推荐
- vue遇到拖拽动态生成组件怎么办?[转]
知识点 主要是关注 动态生成 vue组件,这里是Vue2.0的demo Vue.Draggable 拖拽库 Vue.extend() 挂载 com.$mount() 生成组件 this.$refs.c ...
- 恒玄科技BES250解决方案之双耳链接调试总结和源码分析
一 前言 bes2500芯片在tws耳机应用十分广泛,该芯片有着资源强大,音质好,大厂背书等特色.吸引了不少粉丝跟随. 最近在调试该芯片的tws配对流程,花费了一些时间,踩了一些坑,这里做一个总结和备 ...
- 安装YCM
安装Vundle git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim Vundle也是vim的 ...
- 捉虫日记 | MySQL 8.0从库某些情况下记录重放的CREATE TABLE、DROP TABLE语句到慢日志(slow log)
作者:卢文双 资深数据库内核研发 本文首发于 2023-11-30 20:47:35 https://dbkernel.com 问题描述 当主从复制采用 binlog 的行模式时,如果从库启用 slo ...
- 快速上手系列:JavaScript
第一章 基础语法 1 javascript 的简介 * 是基于对象和事件驱动的语言,应用于客户端. - 基于对象: ** 提供好了很多对象,可以直接拿过来使用 - 事件驱动: ** html 做网站静 ...
- FastWiki(增强AI对话功能)企业级智能客服功能介绍
知识库对话功能 什么是知识库对话? 我们需要找到AI的知识能力是有限的他们的知识都截止于他们训练数据的时间,你提问他们更新的数据的时候他们就会出现乱回复.而知识库则是利用Prompt给于AI更多的知识 ...
- vue中elementui表格错位问题解决(一次到位)
引入element-resize-detector 在项目引入插件(用来监听元素宽度变化) npm install element-resize-detector --save 在文件中引入(写在sc ...
- FPGA原语初步试验
FPGA原语初步实验 1.实验原理 将FPGA的原语基本语法加入到实际的工程中,可以通过实验具体得到相应的数字电路.这里先从与.或.非门开始,准备将数字电路的设计思路引入verilog细节设计. 2. ...
- verilog之锁存器和触发器
verilog锁存器和触发器 1.基本概念 锁存,就是输入信号变化时,输出不发生变化时,就是触发器或者锁存器.触发器的敏感信号是clk,即触发器是知道被延时了多少.对于锁存器来说,延时是不确定的.一般 ...
- Windows系统使用ODBC驱动访问KingaseES数据库及常见问题解决
Windows系统使用KingbaseES ODBC驱动访问KingaseES数据库及常见问题解决. 一.获取KingbaseES数据库ODBC驱动: 在官网下载KingbaseES数据库安装包,选择 ...