之前在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. 三层架构实战篇—系统登录实例
  2. 開啟 Excel 檔案出現錯誤訊息【Windows 找不到檔案路徑
  3. linux c之access方法介绍
  4. 23岁研究生校内坠亡!家人称导师经常辱骂讽刺他,事件涉及两所高校!
  5. 八、华为鸿蒙HarmonyOS应用开发之Java UI框架、常用TextField组件使用
  6. php 建议查询DNS解析状态工具
  7. Developer 转型记:一个开发平台的“魔力”
  8. 【Zookeeper学习】Apache Zookeeper项目简介
  9. Android Support Library更新到v22.1之AppCompat新特性
  10. 独立游戏开发者---孤独前行的梦想家
  11. 公司人事管理系统(C++)
  12. 如何安装Chrome OS系统
  13. 用计算机语言写祝福语,有关程序员节的祝福语
  14. TSINGSEE青犀视频开发安全帽智能检测识别经验分享
  15. ST7701芯片820*320屏幕移植stemwin
  16. TCP/IP模型第二层--数据链路层
  17. Thinkphp 5.1 PC和手机端加载不同路径下的模板~功能实现
  18. apache ii评分和死亡率_APACHEⅢ、SAPSⅡ与APACHEⅡ评分系统对急诊内科危重患者病情评估的临床意义...
  19. [从头读历史] 第269节 诗经 卫风
  20. 分享一个公众号h5裂变吸粉源码工具

热门文章

  1. 工科女生求职记——电子信息科学与技术专业
  2. 换新机数据迁移很头疼?OPPO Find X3让难题迎刃而解
  3. 有什么虚拟主播配音软件可以支持文字配音?
  4. sql优化之oder by
  5. 安卓9[Android P]打开/关闭热点
  6. 我在OData的经历
  7. DateTimePicker 日期时间选择器,清空事件。并添加默认当前时间,向前推进7天的事件
  8. 阿里云ACA课程之掌握负载均衡SLB
  9. Python标准库—codecs模块
  10. VS code java连接MySQL详解