1

细胞自动机(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

时间限制:500ms内存限制:32000kb

import java.util.Scanner;

public class CellMachine {

static Scanner in = new Scanner(System.in);

static int width = 0;// 宽度

static int height = 0;// 高度

static int[][] field_old;// 旧的网格

static int[][] field_new;// 新的网格

static int times;// 步数

public static void main(String[] args) {

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

width = in.nextInt();

height = in.nextInt();

// 初始化数组

initial();

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

times = in.nextInt();

// 细胞自动机执行

run(times);

System.out.println(count(field_old));// 输出一个正整数,表示执行完毕后,剩下的活着的细胞的数量。

}

// 初始化数组

public static void initial() {

field_old = new int[height][width];

field_new = new int[height][width];

for (int i = 0; i < field_old.length; i++) {

for (int j = 0; j < field_old[i].length; j++) {

field_old[i][j] = 0;

field_new[i][j] = 0;

}

}

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

while (true) {

int i = in.nextInt();

int j = in.nextInt();

if (i == -1 && j == -1) {

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

}

field_old[i][j] = 1;

field_new[i][j] = 1;

}

}

// 细胞自动机执行

public static void run(int times) {

int number = 0;

for (int i = 0; i < times; i++) {

for (int j = 0; j < field_old.length; j++) {

for (int k = 0; k < field_old[j].length; k++) {

number = getNeighbour(j, k);// 计算周围活着的细胞

if (field_old[j][k] == 1 && (number == 2 || number == 3)) {

field_new[j][k] = 1;

} else {

field_new[j][k] = 0;

}

if (field_old[j][k] == 0 && number == 3) {

field_new[j][k] = 1;

}

}

}

for (int j = 0; j < field_new.length; j++) {

for (int k = 0; k < field_new[j].length; k++) {

field_old[j][k] = field_new[j][k];// 把新的复制到旧的

}

}

}

}

// 计算周围活着的细胞

public static int getNeighbour(int i, int j) {

int number = 0;

if (i == 0 && j == 0) {// 左上角

number = field_old[i][j + 1] + field_old[i + 1][j + 1] + field_old[i + 1][j];

} else if (i == 0 && j == width - 1) {// 右上角

number = field_old[i][j - 1] + field_old[i + 1][j - 1] + field_old[i + 1][j];

} else if (i == height - 1 && j == 0) {// 左下角

number = field_old[i - 1][j] + field_old[i - 1][j + 1] + field_old[i][j + 1];

} else if (i == height - 1 && j == width - 1) {// 右下角

number = field_old[i - 1][j] + field_old[i - 1][j - 1] + field_old[i][j - 1];

} else if (i == 0) {// 首行其他

number = field_old[i][j - 1] + field_old[i + 1][j - 1] + field_old[i + 1][j] + field_old[i + 1][j + 1]

+ field_old[i][j + 1];

} else if (i == height - 1) {// 末行其他

number = field_old[i][j - 1] + field_old[i - 1][j - 1] + field_old[i - 1][j] + field_old[i - 1][j + 1]

+ field_old[i][j + 1];

} else if (j == 0) {// 最左其他

number = field_old[i - 1][j] + field_old[i - 1][j + 1] + field_old[i][j + 1] + field_old[i + 1][j + 1]

+ field_old[i + 1][j];

} else if (j == width - 1) {// 最右其他

number = field_old[i - 1][j] + field_old[i - 1][j - 1] + field_old[i][j - 1] + field_old[i + 1][j - 1]

+ field_old[i + 1][j];

} else {// 其他

number = field_old[i - 1][j - 1] + field_old[i - 1][j] + field_old[i - 1][j + 1] + field_old[i][j + 1]

+ field_old[i + 1][j + 1] + field_old[i + 1][j] + field_old[i + 1][j - 1] + field_old[i][j - 1];

}

return number;

}

// 剩下的活着的细胞的数量

public static int count(int[][] field) {

int number = 0;

for (int i = 0; i < field.length; i++) {

for (int j = 0; j < field[i].length; j++) {

if (field[i][j] == 1) {

number++;

}

}

}

return number;

}

}

细胞自动机 java_中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机...相关推荐

  1. 面向对象程序设计——Java语言 第3周编程题 查找里程(10分)

    面向对象程序设计--Java语言 第3周编程题 查找里程(10分) 题目内容 下图为国内主要城市之间的公路里程: 你的程序要读入这样的一张表,然后,根据输入的两个城市的名称,给出这两个城市之间的里程. ...

  2. 中国大学MOOC课程《程序设计入门——C语言》 期末考试编程题

    1 最简分式(10分) 题目内容: 分数可以表示为"分子/分母"的形式.编写一个程序,要求用户输入一个分数,然后将其约分为最简分式.最简分式是指分子和分母不具有可以约分的成分了.如 ...

  3. 【Java】《面向对象程序设计——Java语言》Castle代码修改整理

    前言 最近闲来无事刷刷MOOC,找到以前看的浙大翁凯老师的<面向对象程序设计--Java语言>课程,重新过一遍仍觉受益颇深. 其中有一个Castle的例子,思路很Nice但代码很烂,翁凯老 ...

  4. 国二c语言改错题答案,c语言国二考试编程题答案

    <c语言国二考试编程题答案>由会员分享,可在线阅读,更多相关<c语言国二考试编程题答案(65页珍藏版)>请在人人文库网上搜索. 1.1m个人的成绩存放在score数组中,请编写 ...

  5. 四川大学java语言程序设计_四川大学2014年计算机(软件)学院Java语言设计期末考试B卷程序.doc...

    四川大学期末考试试题(闭卷) (2014-2015学年第2学期) 课程号: 课程名称: Java语言程序设计(B 卷)任课教师: 适用专业年级: 学号: 姓名: 考试须知 四川大学学生参加由学校组织或 ...

  6. 大一下c语言期末考试编程题,大一上期末C语言编程题

    大一上期末C语言编程题 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 用公式 π/4 = 1-1/3+1/5-1/7--,编程序 ...

  7. 《面向对象程序设计——Java语言·翁恺》第3周编程题 查找里程

    题目概述: 已知国内主要城市之间的公路里程表.读入这样的一张表城市里程表(部分数据),然后根据输入的两个城市的名称,给出这两个城市之间的里程. 题目链接: https://www.icourse163 ...

  8. 四十八.面向对象程序设计——Java语言第一周编程题:分数

    题目内容: 设计一个表示分数的类Fraction.这个类用两个int类型的变量分别表示分子和分母. 这个类的构造函数是: Fraction(int a, int b) 构造一个a/b的分数. 这个类要 ...

  9. 零基础学Java语言--第6周编程题

    1单词长度(5分) 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本中每个单词的长度.这里的单词与语言无关,可以包括各种符号,比如"it's&q ...

  10. 程序设计入门——C语言 翁恺 期末考试编程题

    最简分式(10分) 题目内容: 分数可以表示为"分子/分母"的形式.编写一个程序,要求用户输入一个分数,然后将其约分为最简分式.最简分式是指分子和分母不具有可以约分的成分了.如6/ ...

最新文章

  1. 【C语言】用宏实现将一个整数的二进制位的奇数位和偶数位交换
  2. ThreadGroup
  3. python27文件夹_为什么python27.dll不是python安装文件夹的一部分,而是在Windows系统文件夹中...
  4. 阿里云周源:一篇文章读懂四代视频加密技术演进
  5. 记录一次空指针异常(NullPointerException)的断点调试
  6. 小白设计模式:策略模式
  7. timerfd_create Function not implemented问题
  8. J2EE的十三个技术规范
  9. 解决Adobe Flash Player不是最新版本方法
  10. 一个非常好用的文字滚动的案例,鼠标悬浮可暂停
  11. MYSQL 经纬度 地理位置
  12. 如何在twitter上看片_我在Twitter上一年学到的东西
  13. 亚楠魔域单机V6一键端分享
  14. 湖南大学ACM程序设计新生杯大赛(同步赛)L-Liao Han【打表规律+二分】
  15. Jboot框架的使用
  16. android 轮换实现动画,怎么在Android中实现一个首页无限轮播功能
  17. excel取消密码_取消excel工作簿的保护(无密码)
  18. css 动画时钟 时分秒
  19. 如何使用MATLAB将两张或者多张figure图形合并到一个figure图形里进行对比
  20. 页面禁止长按保存图片和长按复制文字

热门文章

  1. dnf脚本是php,易语言:DNF自动脚本
  2. 指令级并行——超标量Superscalar与超长指令字VLIW架构
  3. Linux使用QQ邮箱
  4. 计算机桌面图片查看,在CAD看图中如何快速的打开电脑桌面上的图纸进行预览查看...
  5. 一文看懂有刷电机与无刷电机的工作原理及区别
  6. 什么是特洛伊木马病毒?
  7. SketchUp-2022版本
  8. rtl8821cs wifi驱动调试 imx6
  9. 计算机网络技术超星尔雅章节检测,计算机网络技术超星尔雅答案题库
  10. android studio 融云,融云 SDK 集成详解 – Android Studio