懒人读算法(二)-细胞问题

2024-06-16 18:32
文章标签 算法 问题 懒人 细胞

本文主要是介绍懒人读算法(二)-细胞问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

细胞问题:
每个细胞有两种状态:1为活细胞,0为死细胞,对于每个位置都满足如下的条件:

  1. 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡

  2. 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活

  3. 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡

  4. 如果死细胞周围正好有三个活细胞,则该位置死细胞复活


public class Solution {public void gameOfLife(int[][] board) {if(board == null || board.length == 0) {return;}int m = board.length;int n = board[0].length;for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {int lives = liveNeighbors(board, m, n, i, j);if(board[i][j] ==  1 && lives >= 2 && lives <= 3) {//有两个或三个则繁衍下一代board[i][j] = 3;}if(board[i][j] == 0 && lives == 3) {//如果死细胞周围正好有三个活细胞,则该位置死细胞复活board[i][j] = 2;}}}for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {board[i][j] >>= 1;//经过一轮后,状态0和2就变成死细胞,状态1和3就是活细胞}}}private int liveNeighbors(int[][] board, int m, int n, int i, int j) {int lives = 0;for(int x = Math.max(i - 1, 0); x <= Math.min(i + 1, m - 1); x++) {for(int y = Math.max(j - 1, 0); y <= Math.min(j + 1, n - 1); y++) {lives += board[x][y] & 1;}}lives -= board[i][j] & 1;//减去自己return lives;}}

下面我对代码进行解答:

      int lives = 0;for(int x = Math.max(i - 1, 0); x <= Math.min(i + 1, m - 1); x++) {for(int y = Math.max(j - 1, 0); y <= Math.min(j + 1, n - 1); y++) {lives += board[x][y] & 1;}}

代码解析:

  1. 双重for循环就是先循环行,再循环当前行的列
  2. max(i-1,0)就是取最大值,如果i为0的话就取0,i为2的话的就取1
  3. 同理,min(i+1,m-1)就是当前1行和最大行做比较
  4. &为与计算,当前仅当两个都为1时才为1
   for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {board[i][j] >>= 1;//经过一轮后,状态0和2就变成死细胞,状态1和3就是活细胞}}

代码解析:

  1. >>=是把当前值(先转二进制)向右移后赋予前面的值
  2. 例如7>>=1则是111(二进制的7)向右移变为11(二进制的3)则原先的7变为3

这篇关于懒人读算法(二)-细胞问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067213

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模