力扣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 ...
随机推荐
- python面向对象(选课系统)
一.需求分析(课程与班级合为一体) -管理员视图 -1.注册 -2.登录 -3.创建学校 -4.创建课程(先选择学校) -5.创建讲师 -学员视图 -1.注册 -2.登录功能 -3.选择校区 -4.选 ...
- Android组件化开发实践和案例分享
目录介绍 1.为什么要组件化 1.1 为什么要组件化 1.2 现阶段遇到的问题 2.组件化的概念 2.1 什么是组件化 2.2 区分模块化与组件化 2.3 组件化优势好处 2.4 区分组件化和插件化 ...
- 记录--用js如何实现将手机号中间的几位数字变成****
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 今天,我们要实现一个很常见并且简单的功能:将手机号中间的几位数变成**** 这个功能其实很常见,比如我们微信的账号安全里面显示的手机号.掘 ...
- 记录--vue组件划分的思考
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 对vue项目来说,组件是构成项目的基本单元,为了方便理解,这里定义两类组件:页面组件,功能组件.为什么需要划分这两类组件是从组件复用来考虑 ...
- 记录--uniapp上如何实现安卓app微信登录功能(操作流程总结)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 uniapp上如何实现安卓app微信登录功能?下面本篇文章给大家分享一下uniapp上实现安卓app微信登录的权限申请.开发的具体操作流程 ...
- Elasticsearch按照某个字段去重查询
索引较多: index-1_t_order index-2_t_order index-32_t_order 根据pay_amount排序,order_no去重,最后分页. 说明:1.collapse ...
- KingbaseES V8R3集群运维案例---failover切换故障分析
案例说明: KingbaseES V8R3集群主库数据库服务重启后,failover切换失败,分析failover失败的具体原因. 适用版本: KingbaseES V8R3 一.集群架构 node1 ...
- 大数据hadoop Linux 相关常用命令行操作
bin/zkServer.sh start bin/zkServer.sh stop 启动Hadoop 1 hadoop102 sbin/start-dfs.sh 2 hadoop103 sbin/s ...
- 5 HTML表单标签
5 表单标签 表单主要是用来收集客户端提供的相关信息,提供了用户数据录入的方式,有多选.单选.单行文本.下拉列表等输入框,便于网站管理员收集用户的数据,是Web浏览器和Web服务器之间实现信息交流和数 ...
- 大咖齐聚!OpenHarmony技术峰会豪华嘉宾阵容揭晓
第一届开放原子开源基金会OpenHarmony技术峰会即将来袭 重量级嘉宾和行业大咖高能集结 展示OpenHarmony操作系统技术革新 1场主论坛.6场分论坛干货拉满 2月25日,一起解锁更多精 ...