题目:

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 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. 5分钟上手Python爬虫:从干饭开始,轻松掌握技巧

    很多人都听说过爬虫,我也不例外.曾看到别人编写的爬虫代码,虽然没有深入研究,但感觉非常强大.因此,今天我决定从零开始,花费仅5分钟学习入门爬虫技术,以后只需轻轻一爬就能查看所有感兴趣的网站内容.广告? ...

  2. Google Chart API学习(二)

    书接上回: combo-charts: <html> <head> <script type="text/javascript" src=" ...

  3. 在Ubuntu14.04上安装qt5和qtcreator的 两种方式(源代码和xxxxx.run) 和我的感悟-------超级详细版

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文发布于 2014-07-25 12:21:13 ...

  4. 专访深职院 XR 专家 | 实时云渲染赋能虚拟仿真实训,打造 5G+XR 智慧教育平台

    近年,国家高度重视职业教育,为主动应对新一轮科技革命与产业变革,支撑服务创新驱动发展,教育部积极推进新工科建设.加快教育改革创新.在职业教育上,XR 技术与教育的结合,的的确确弥补了传统职业教育中&q ...

  5. drf(路由)

    一 自动生成路由 基本使用 # 视图类,继承了ViewSetMixein,路由 # path('books/', views.BookViewSet.as_view(actions={'get': ' ...

  6. 记录--CSS 滚动驱动动画 scroll()

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 CSS 滚动驱动动画 scroll() animation-timeline 通过 scroll() 指定可滚动元素与滚动轴来为容器动画提 ...

  7. 记录--对于$off,Exclude 和 Extract的一点理解

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.typescript 高阶类型 Exclude 和 Extract Exclude<T, U> TypeScript 2. ...

  8. VScode 配置私钥免密登录

    VScode 配置私钥免密登录 配置公钥私钥进行免密登录在前文已经提及.在完成上述配置后,我们希望在VScode中配置,毕竟主要的开发环境还是在VScode上且连接到远程服务器会经常遇到网络不稳定需要 ...

  9. 脱离于ASP.NET 和Visual Studio编辑Razor脚本

    Razor Pad是一个编辑Razor脚本的工具,脱离于ASP.NET 和Visual Studio. github地址:https://github.com/RazorPad/RazorPad 如果 ...

  10. .NET开源免费、功能强大的 Windows 截图录屏神器

    前言 今天大姚给大家分享一款.NET开源免费(基于GPL3.0开源协议).功能强大.简洁灵活的 Windows 截图.录屏.Gif动图制作神器:ShareX. 功能特性 ShareX 是一个开源的屏幕 ...