Leetcode 289.生命游戏

生命游戏

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

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

  1. 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
  2. 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
  3. 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
  4. 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;

根据当前状态,写一个函数来计算面板上细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。

示例:

输入:

[

[0,1,0],

[0,0,1],

[1,1,1],

[0,0,0]

]

输出:

[

[0,0,0],

[1,0,1],

[0,1,1],

[0,1,0]

]

进阶:

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

于题目中要求所有点的状态需要一次性发生改变,而且不用额外的空间,这是本题的最大难点。

既然需要"就地解决",我们不妨分析一下borad的特性:board上的元素有两种状态,生(1)和死(0)。这两种状态存在了一个int型里面。所以我们可以有效利用除最低位的其它位,去保存更新后的状态,这样就不需要有额外的空间了。

具体而言,我们可以用最低位表示当前状态,次低位表示更新后状态:

  • 00(0):表示当前是死,更新后是死;
  • 01(1):表示当前是生,更新后是死;
  • 10(2):表示当前是死,更新后是生;
  • 11(3):表示当前是神,更新后是生。
 1 class Solution {
 2     public void gameOfLife(int[][] board) {
 3         int row=board.length;
 4         if(row<1) return;
 5         int col=board[0].length;
 6         if(col<1) return;
 7         int[][] move={{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}};
 8         for(int i=0;i<row;i++){
 9             for(int j=0;j<col;j++){
10                 int live=0;
11                 for(int k=0;k<8;k++){
12                     int x=i+move[k][0];
13                     int y=j+move[k][1];
14                     if(x<0||y<0||x>=row||y>=col) continue;
15                     if((board[x][y]&1)==1) ++live;
16                 }
17                 if((board[i][j]&1)==1){
18                     if(live<2||live>3) board[i][j]=1;
19                     else board[i][j]=3;
20                 }else{
21                     if(live==3) board[i][j]=2;
22                 }
23             }
24         }
25         for(int i=0;i<row;i++){
26             for(int j=0;j<col;j++){
27                 board[i][j]>>=1;
28             }
29         }
30     }
31 }

原文地址:https://www.cnblogs.com/kexinxin/p/10204994.html

时间: 2024-10-12 11:25:45

Leetcode 289.生命游戏的相关文章

LeetCode 289 - 生命游戏 - 原地算法

Wikipedia关于原地算法的描述:原地算法(in-place algorithm)基本上不需要额外辅助的数据结构,然而,允许少量额外的辅助变量来转换数据的算法.当算法运行时,输入的数据通常会被要输出的部分覆盖掉. 很容易看出,原地算法的特点是不需要辅助的数据结构而只需要辅助变量.通常,维护一个复杂的数据结构时间空间复杂度都是比较高的,原地算法的优越性正来自于不依赖数据结构,尽管它借鉴了数据结构的思想. 同时也不难看出,原地算法总体的实现思路就是用输出的数据在原地覆盖已经“没用”的输入的数据.

[Leetcode] 第289题 生命游戏

一.题目描述 根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有一个初始状态 live(1)即为活细胞, 或 dead(0)即为死细胞.每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律: 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡: 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活: 如果活细胞周围八个位置有

LeetCode:Game of Life - 康威生命游戏

1.题目名称 Game of Life(康威生命游戏) 2.题目地址 https://leetcode.com/problems/game-of-life 3.题目内容 英文: According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conw

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

首先简单介绍一下<生命游戏> 生命游戏其实是一个零玩家游戏.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量.如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去:相反,如果周围活细胞过少,这个细胞会因太孤单而死去.具体如下图: 每个格子的生死遵循下面的原则: 1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,

C语言练习题一道——生命游戏

生命游戏是一个很简单,但却是很有趣的程序习题.在一个四周都可以延伸到无限的 棋盘上的某个格子中会有一个有机体.每一个有机体在时间t 时,会依照环绕着它的8 个邻 居的特性而决定在时间t+1 时是否能生存下去.如果某一格在时间t 时: (1)有一个有机体,但是它的邻居少于或等于1 个,或者是大于3 个,那就会因为不 够稠密或太过稠密,这个有机体在时间t+1 时就会死亡:换言之,在t+1 时间,那一格中不 会存在有机体.下面就是几个在时间t+1 时会死亡的例子,如图1 所示. 图1 (2)有有机体在

生命游戏 Java

本程序由四个类组成: 其中Init_data,用于初始化各个活细胞的状态judge_state,用于判断下一代的细胞状态,并进行更新.set_color,用于给GUI界面中各个细胞涂色set_frame,用于设置GUI界面的布局 1 /*初始化细胞状态类 2 * 四个模式 3 * 1.easy模式,一个大写的I 4 * 2.love模式,一个大写的LOVE 5 * 3.arrow模式,一个粗箭头 6 * 4.random模式,根据随机函数生成活细胞数 7 */ 8 package game_li

leetcode 174. 地下城游戏 解题报告

leetcode 174. 地下城游戏 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始健康点数为一个正整数.如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡. 有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数):其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔

【转载】【元胞自动机】生命游戏(时间简史)

原帖:http://www.cnblogs.com/lvpengms/archive/2010/02/08/1666095.html 晚上闲着没事干,鉴于前一段时间数学建模中看到了生命游戏 Game of Life,所以用C++实现一下,效果还不错. 本程序是用vs2005 C++编写,有意想要程序和源码的朋友可以给我发邮件. 更新:程序源码可以从这个地址下载:下载元胞自动机源码及程序 =======================================================

生命游戏和随机数之间某种不可言说的秘密

为什么我感觉随便写一个一维生命游戏规则就可以做出一个看起来很随机实际上也蛮随机的随机数生成器.... 这是代码: 1 #include <cstdio> 2 #include <fstream> 3 #include <iostream> 4 5 #include <cstdlib> 6 #include <cstring> 7 #include <algorithm> 8 #include <cmath> 9 10 #i