之前在MOOC大学翁恺讲的Java进阶的期末题使用了二维数组去求解:

细胞自动机(30分)

题目内容:

这是细胞自动机的非图形版本。细胞自动机是指在一个二维网格内,每一个网格是一个细胞。每个细胞有活和死两种状态。

初始时刻,有些细胞是活的,有些细胞是死的。自动机的每一步,根据每个细胞周围8个格子内的其他细胞的生存情况决定这个细胞下一步是否存活。具体的规则如下:

  • 如果该细胞现在是活的,并且周围8个格子中有2或3个活着的细胞,则继续存活;如果周围8个格子中的活着的细胞数量少于2个或多于3个,则死亡;

  • 如果该细胞现在是死的,并且周围8个格子中正好有3个活着的细胞,则细胞复活。

  • 位于整个网格边缘和顶角的细胞,它的周围细胞可能少于8个。即越过网格的边界不再有细胞。

  • 每个细胞的生死变化,都不会影响当前这一步周围的细胞,只会在下一步表现出来。

提示:课程中的代码与上一句描述不同。

输入格式:

首先输入两个正整数,范围为[3,102],依次表示网格的宽度和高度。

然后输入多组正整数,依次表示一个活着的细胞的网格位置,每组数字中,第一个表示行号,第二个表示列号,均从0开始编号。

最后,以“-1 -1”表示不再有活着的细胞。-1 -1不是有效的位置。

然后,以一个正整数,范围为[1,10000],表示要求细胞自动机执行的步数。

输出格式:

输出一个正整数,表示执行完毕后,剩下的活着的细胞的数量。

输入样例:

3 3

1 1 1 2 0 1 2 1

-1 -1

1

输出样例:

7

那天静下心来做了一下,花了些功夫,总得来说这个题跟http://on-img.com/chart_image/5b028e51e4b05f5d6b5feab6.png这个题有点类似,都是使用了二维数组.

分析下题干,http://on-img.com/chart_image/5b3cd291e4b0d3d5d0b77b63.png,其实难点在于判断二维数组的边角位置(突然想起了健身房经理那句话: 金角银边...)

最终还没有对代码进行重构,

import java.util.Scanner;public class CellMachine {public static void main(String[] args) {// ScannerScanner in = new Scanner(System.in);// 矩阵大小设置int[][] oldCellMat;int[][] cellMatrix;int width = 0;int height = 0;width = in.nextInt();height = in.nextInt();if (width >= 3 && height >= 3 && width <= 102 && height <= 102) {oldCellMat = new int[height][width];// 5,6的话最大下标是4,5cellMatrix = new int[height][width];} else {return;}// 矩阵细胞设置int i = 0;int j = 0;while (true) {i = in.nextInt();// 行号最大为<heightj = in.nextInt();// 列号最大为<widthif(i==-1 && j==-1) {break;}else {if (i >= 0 && j >= 0 && i < height && j < width) {if (cellMatrix[i][j] == 1) {return;}cellMatrix[i][j] = 1;oldCellMat[i][j] = 1;}else {return;}}}int step = 0;step = in.nextInt();while (step != 0) {for (int row = 0; row < height; row++) {for (int col = 0; col < width; col++) {boolean angle = ((row == 0) && (col == 0)) || ((row == 0) && (col == (width - 1)))|| ((row == (height - 1)) && (col == 0)) || ((row == (height - 1)) && (col == (width - 1)));// boolean edge = ((row == 0) && (col != 0)) || col != (width - 1)) || col == 0// && (row != 0 || row != (height - 1))// || row == (height - 1) && (col != 0 || col != (width - 1)) || col == (width -// 1))// && (row != 0 || row != (height - 1));boolean normal = row > 0 && col > 0 && row < (height - 1) && col < (width - 1);boolean edge = !(angle) && !(normal);// 如果有细胞了的话if (cellMatrix[row][col] == 1) {// 如果是角上细胞if (angle) {// 左上角细胞if (row == 0 && col == 0) {int cellNumbers = cellMatrix[row][col + 1] + cellMatrix[row + 1][col]+ cellMatrix[row + 1][col + 1];if (cellNumbers == 2 || cellNumbers == 3) {// 继续存活} else if (!(cellNumbers == 2 || cellNumbers == 3)) {System.out.println("["+row+","+col+"]"+">>细胞死亡");oldCellMat[row][col] = 0;// 细胞死亡
                                }}// 右上角细胞if (row == 0 && col == (width - 1)) {int cellNumbers = cellMatrix[row][col - 1] + cellMatrix[row + 1][col]+ cellMatrix[row + 1][col - 1];if (cellNumbers == 2 || cellNumbers == 3) {// 继续存活} else if (!(cellNumbers == 2 || cellNumbers == 3)) {System.out.println("["+row+","+col+"]"+">>细胞死亡");oldCellMat[row][col] = 0;// 细胞死亡
                                }}// 左下角细胞if (row == (height - 1) && col == 0) {int cellNumbers = cellMatrix[row - 1][col] + cellMatrix[row][col + 1]+ cellMatrix[row - 1][col + 1];if (cellNumbers == 2 || cellNumbers == 3) {// 继续存活} else if (!(cellNumbers == 2 || cellNumbers == 3)) {System.out.println("["+row+","+col+"]"+">>细胞死亡");oldCellMat[row][col] = 0;// 细胞死亡
                                }}// 右下角细胞if (row == (height - 1) && col == (width - 1)) {int cellNumbers = cellMatrix[row][col - 1] + cellMatrix[row - 1][col]+ cellMatrix[row - 1][col - 1];if (cellNumbers == 2 || cellNumbers == 3) {// 继续存活} else if (!(cellNumbers == 2 || cellNumbers == 3)) {System.out.println("["+row+","+col+"]"+">>细胞死亡");oldCellMat[row][col] = 0;// 细胞死亡
                                }}}// 如果是边上细胞 <<else if (edge) {// 最上沿细胞if (row == 0) {int cellNumbers = cellMatrix[row][col - 1] + cellMatrix[row][col + 1]+ cellMatrix[row + 1][col - 1] + cellMatrix[row + 1][col]+ cellMatrix[row + 1][col + 1];if (cellNumbers == 2 || cellNumbers == 3) {// 继续存活} else if (!(cellNumbers == 2 || cellNumbers == 3)) {System.out.println("["+row+","+col+"]"+">>细胞死亡");oldCellMat[row][col] = 0;// 细胞死亡
                                }}// 最左沿细胞if (col == 0) {int cellNumbers = cellMatrix[row - 1][col] + cellMatrix[row + 1][col]+ cellMatrix[row - 1][col + 1] + cellMatrix[row][col + 1]+ cellMatrix[row + 1][col + 1];if (cellNumbers == 2 || cellNumbers == 3) {// 继续存活} else if (!(cellNumbers == 2 || cellNumbers == 3)) {System.out.println("["+row+","+col+"]"+">>细胞死亡");oldCellMat[row][col] = 0;// 细胞死亡
                                }}// 最下沿细胞if (row == (height - 1)) {int cellNumbers = cellMatrix[row][col - 1] + cellMatrix[row][col + 1]+ cellMatrix[row - 1][col - 1] + cellMatrix[row - 1][col]+ cellMatrix[row - 1][col + 1];if (cellNumbers == 2 || cellNumbers == 3) {// 继续存活} else if (!(cellNumbers == 2 || cellNumbers == 3)) {System.out.println("["+row+","+col+"]"+">>细胞死亡");oldCellMat[row][col] = 0;// 细胞死亡
                                }}// 最右沿细胞if (col == (width - 1)) {int cellNumbers = cellMatrix[row - 1][col] + cellMatrix[row + 1][col]+ cellMatrix[row - 1][col - 1] + cellMatrix[row][col - 1]+ cellMatrix[row + 1][col - 1];if (cellNumbers == 2 || cellNumbers == 3) {// 继续存活} else if (!(cellNumbers == 2 || cellNumbers == 3)) {System.out.println("["+row+","+col+"]"+">>细胞死亡");oldCellMat[row][col] = 0;// 细胞死亡
                                }}}// 周围有8元素的细胞else if (normal) {int cellNumbers = cellMatrix[row - 1][col - 1] + cellMatrix[row - 1][col]+ cellMatrix[row - 1][col + 1] + cellMatrix[row][col - 1] + cellMatrix[row][col + 1]+ cellMatrix[row + 1][col - 1] + cellMatrix[row + 1][col]+ cellMatrix[row + 1][col + 1];if (cellNumbers == 2 || cellNumbers == 3) {// 继续存活} else if (!(cellNumbers == 2 || cellNumbers == 3)) {System.out.println("["+row+","+col+"]"+">>细胞死亡");oldCellMat[row][col] = 0;// 细胞死亡
                            }}// 当细胞为空0时进入else} else if (cellMatrix[row][col] == 0){// 如果是角上细胞if (angle) {// 左上角细胞if (row == 0 && col == 0) {int cellNumbers = cellMatrix[row][col + 1] + cellMatrix[row + 1][col]+ cellMatrix[row + 1][col + 1];if (cellNumbers == 3) {System.out.println("["+row+","+col+"]"+">>细胞再生");oldCellMat[row][col] = 1;// 细胞再生} else {// 保持死亡
                                }}// 右上角细胞if (row == 0 && col == (width - 1)) {int cellNumbers = cellMatrix[row][col - 1] + cellMatrix[row + 1][col]+ cellMatrix[row + 1][col - 1];if (cellNumbers == 3) {System.out.println("["+row+","+col+"]"+">>细胞再生");oldCellMat[row][col] = 1;// 细胞再生} else {// 保持死亡
                                }}// 左下角细胞if (row == (height - 1) && col == 0) {int cellNumbers = cellMatrix[row - 1][col] + cellMatrix[row][col + 1]+ cellMatrix[row - 1][col + 1];if (cellNumbers == 3) {System.out.println("["+row+","+col+"]"+">>细胞再生");oldCellMat[row][col] = 1;// 细胞再生} else {// 保持死亡
                                }}// 右下角细胞if (row == (height - 1) && col == (width - 1)) {int cellNumbers = cellMatrix[row][col - 1] + cellMatrix[row - 1][col]+ cellMatrix[row - 1][col - 1];if (cellNumbers == 3) {System.out.println("["+row+","+col+"]"+">>细胞再生");oldCellMat[row][col] = 1;// 细胞再生} else {// 保持死亡
                                }}}// 如果是边上细胞else if (edge) {// 最上沿细胞if (row == 0) {int cellNumbers = cellMatrix[row][col - 1] + cellMatrix[row][col + 1]+ cellMatrix[row + 1][col - 1] + cellMatrix[row + 1][col]+ cellMatrix[row + 1][col + 1];if (cellNumbers == 3) {System.out.println("["+row+","+col+"]"+">>细胞再生");oldCellMat[row][col] = 1;// 细胞再生} else {// 保持死亡
                                }}// 最左沿细胞if (col == 0) {int cellNumbers = cellMatrix[row - 1][col] + cellMatrix[row + 1][col]+ cellMatrix[row - 1][col + 1] + cellMatrix[row][col + 1]+ cellMatrix[row + 1][col + 1];if (cellNumbers == 3) {System.out.println("["+row+","+col+"]"+">>细胞再生");oldCellMat[row][col] = 1;// 细胞再生} else {// 保持死亡
                                }}// 最下沿细胞if (row == (height - 1)) {int cellNumbers = cellMatrix[row][col - 1] + cellMatrix[row][col + 1]+ cellMatrix[row - 1][col - 1] + cellMatrix[row - 1][col]+ cellMatrix[row - 1][col + 1];if (cellNumbers == 3) {System.out.println("["+row+","+col+"]"+">>细胞再生");oldCellMat[row][col] = 1;// 细胞再生} else {// 保持死亡
                                }}// 最右沿细胞if (col == (width - 1)) {int cellNumbers = cellMatrix[row - 1][col] + cellMatrix[row + 1][col]+ cellMatrix[row - 1][col - 1] + cellMatrix[row][col - 1]+ cellMatrix[row + 1][col - 1];if (cellNumbers == 3) {System.out.println("["+row+","+col+"]"+">>细胞再生");oldCellMat[row][col] = 1;// 细胞再生} else {// 保持死亡
                                }}}// 周围有8元素的细胞else if (normal) {int cellNumbers = cellMatrix[row - 1][col - 1] + cellMatrix[row - 1][col]+ cellMatrix[row - 1][col + 1] + cellMatrix[row][col - 1] + cellMatrix[row][col + 1]+ cellMatrix[row + 1][col - 1] + cellMatrix[row + 1][col]+ cellMatrix[row + 1][col + 1];if (cellNumbers == 3) {System.out.println("["+row+","+col+"]"+">>细胞再生");oldCellMat[row][col] = 1;// 细胞再生} else {// 保持死亡
                            }}} // else_end cellMatrix[row][col] != 1} // inner_for_end} // for_endfor (int w = 0; w < height; w++) {for (int v = 0; v < width; v++) {cellMatrix[w][v] = oldCellMat[w][v];}}step--;} // while_edint count = 0;for (int m = 0; m < height; m++) {for (int n = 0; n < width; n++) {if (cellMatrix[m][n] == 1) {count++;}}}System.out.println(">>最终存活细胞数量:"+count+"<<");
//        System.out.println(count);
    }}

最近越发得留意和想起网上的那句话:写代码是个细致活,是个手艺.不单纯是个技术.

钻研有时候是很痛苦的,那是因为书看得少了.

再把心平复下来,好好看看算法那本书吧,以及其他的在图灵图书分享的那些算法书籍.算法也是编程的一个重要内容啊

在CW上做的java题,还有几道对我而言难度有些大,而手头还要做两个web项目.

时间如果再充沛些就好了!

将编程看作是一门艺术,而不单单是个技术。 敲打的英文字符是我的黑白琴键, 思维图纸画出的是我编写的五线谱。 当美妙的华章响起,现实通往二进制的大门即将被打开。

细胞自动机 二维数组的使用相关推荐

  1. Java IDEA Debug进制二维数组

    1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 1.2 Debug介绍与操作流程 如何加断点 选择 ...

  2. Python数据挖掘1:创建一位数组和二维数组,取最大最小值,切片

    ''' 来源:天善智能韦玮老师课堂笔记 1.numpy 可以高效处理数据.提供数组支持.很多模块都依赖他,比如pandas.scipy.matplotlib都依赖他,所以这个模块是基础. 2.pand ...

  3. Numpy 生成 Bool型数组、一维转多维数组reshape、多维转一维数组、替换数组元素、提取数组元素、数组交集、差集、过滤数组元素、二维数组反转行、交换数组维度

    1. 创建一个 [3,5] 所有元素为 True 的数组 In [162]: b = np.ones((3,5), dtype=bool)In [163]: b Out[163]: array([[ ...

  4. Numpy 一维、二维数组、size/dtype/shape属性、数组函数arange/linspace/logspace /diag/zeros/ones/random 、多维数组索引和筛选)

    参考: https://gitbook.cn/gitchat/column/undefined/topic/5e3bceadec8d9033cf924665 打开 IPython ,创建 Python ...

  5. C++二维数组名与数组指针的思考

    二维数组名和数组指针可以当做一个东西用,但两者之间的含义是不同的. 二维数组名是一个指向数组中所有元素的指针,而数组指针是一个行指针.体现在sizeof()上的不同. #include <ios ...

  6. 建立二维数组_二维数组的 DP

    寻找不同路径和 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标 ...

  7. c语言N*N的二维数组,c语言高手帮个忙(请先看问题,好解答

    程序定义了N×N的二维数组,并在主函数中自动赋值.请编写函数fun(int a[ ][ N ],int n),该函数的功能是使数组左下半三角元素中的值加上n.例如:若n的值为3,a数组中的值为a=2 ...

  8. cout 数组_C语言学习笔记(十)二维数组内存预设

    1 问题描述 二维数组存储数据数量根据其他方法间接获得: 为当前数据数量申请内存: 2 相关程序 #include --2020.11.23--

  9. 剑指offer:面试题04. 二维数组中的查找

    题目:二维数组中的查找 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...

最新文章

  1. gym 102875 H. Happy Morse Code
  2. 软件测试nodejs面试题,nodejs单元测试和性能测试
  3. 移动互联网APP测试流程及测试点(转载) (二)
  4. 使用C#+Edge (Chromium)进行Web自动化测试
  5. redis key命名规范_redis简介
  6. Viewport的使用《转》
  7. C语言的体系结构--main函数存在的必然性(听杨力祥老师的课)
  8. 58同城溢价私有化,互联网“前浪”躲不过“七年之痒”?
  9. Internet Explorer 无法打开 Internet 站点
  10. 小柯-java 进阶
  11. 罗振宇4小时跨年演讲精华版:大环境里的7个行动策略
  12. 阿里研究院:2019企业数智化转型发展报告:无业务不数据,无数据不智能,无智能不商业...
  13. [JAVA]前后端分离智慧校园电子班牌系统源码微信带小程序
  14. 201226元件_看电阻型号
  15. 用python画小鸭,Python 处理输入法字库(五笔极点字库转小鸭字库)
  16. 强制重启Linux系统的几种方法
  17. MATLAB身份证号码定位检测识别GUI
  18. 经济危机为什么也是创业良机?
  19. 物联网发展预期与展望
  20. visio 封闭图形的填充过程

热门文章

  1. oneplus2系统_OnePlus正在启动一个与苹果竞争的生态系统
  2. Lattice Planner从学习到放弃(四):问题与处理
  3. 微机原理:汽车速度控制系统的设计与实现
  4. 响应式网页-我的商城作品展示
  5. iOS——armv7,armv7s,arm64详解
  6. 深度学习(三)结构化机器学习项目-机器学习策略2 -Andrew Ng
  7. 如何用python画爱心代码_用 python 画爱心代码讲解
  8. Eclipse插件开发之Wizard的学习与创建
  9. 阿里P8高级技术专家自述被裁员,疑似给市长写信,房贷月供3w,压力很大,出门面试找工作很难!...
  10. 三年级计算机说课备案,《燕子》说课稿教学备案.doc