中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机
期末考试编程题
这是期末考试的编程题
温馨提示:
1.本次考试属于Online Judge题目,提交后由系统即时判分。
2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩。
题目内容:
这是细胞自动机的非图形版本。细胞自动机是指在一个二维网格内,每一个网格是一个细胞。每个细胞有活和死两种状态。
初始时刻,有些细胞是活的,有些细胞是死的。自动机的每一步,根据每个细胞周围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
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;
	}
}
中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机的更多相关文章
- 中国MOOC_面向对象程序设计——Java语言_第3周 对象容器_1查找里程
		第3周编程题 查看帮助 返回 第3周编程题.注意程序(包括注释)中不能出现汉字. 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后 ... 
- 中国MOOC_面向对象程序设计——Java语言_第2周 对象交互_秒计时的数字时钟
		第2周编程题 查看帮助 返回 第2周编程题,在课程所给的时钟程序的基础上修改 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系 ... 
- 中国MOOC_面向对象程序设计——Java语言_第1周 类与对象
		第1周编程题 查看帮助 返回 我们在题目说明中给出了一部分代码,你需要在这部分代码的基础上,按照题目说明编写代码,然后将两部分代码一起提交. 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨 ... 
- 中国MOOC_面向对象程序设计——Java语言_第2周 对象交互_1有秒计时的数字时钟
		第2周编程题 查看帮助 返回 第2周编程题,在课程所给的时钟程序的基础上修改 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系 ... 
- 中国MOOC_面向对象程序设计——Java语言_第1周 类与对象_1分数
		第1周编程题 查看帮助 返回 我们在题目说明中给出了一部分代码,你需要在这部分代码的基础上,按照题目说明编写代码,然后将两部分代码一起提交. 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨 ... 
- 中国MOOC_面向对象程序设计——Java语言_第4章 继承与多态_第4周编程题_将MP3媒体类型存放进Database
		本周我们介绍了以继承方式实现的媒体资料库,在课程代码实现的基础上,请实现一个表达MP3的媒体类型,能和CD.DVD一样存放进这个Database.请提交这个MP3类的代码.如果你认为为了能存放MP3, ... 
- 面向对象程序设计--Java语言第三周编程题:查找里程
		查找里程 题目内容: 下图为国内主要城市之间的公路里程: 你的程序要读入这样的一张表,然后,根据输入的两个城市的名称,给出这两个城市之间的里程. 注意:任何两个城市之间的里程都已经给出,不需要计算经第 ... 
- 网易云课堂_程序设计入门-C语言_期末考试编程题
		1 字数统计(10分) 题目内容: 你的程序要读入一篇英文文章,然后统计其中的单词数来输出.需要统计的数据为: 总的单词数量: 含有1个字母到10个字母的单词的数量. 单词和单词的间隔是由以下标点符号 ... 
- 中国MOOC_零基础学Java语言_期末考试的编程题_1二进制的前导的零
		期末考试的编程题 返回 这是期末考试的编程题,在60分钟内,你可以多次提交,直到正确为止. 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止 ... 
随机推荐
- Windows 下apache https配置(phpstudy)
			1.首先获取证书,https://www.pianyissl.com/ 免费三个月的 或者 自己生成私钥.证书,然后应用到apache中. http://blog.sina.com.cn/s/blo ... 
- 有准备的面试才能拿到更好的 Offer
			http://www.sohu.com/a/331411917_181657 前几天有读者问我,工作不顺利辞职了.本来以为凭借自己的能力和工作经验可以轻松找到更好的工作,结果投了简历,约面试的很少,面 ... 
- (转) Weblogic在Linux上节点服务器启动正常,计算机连接不上
			对于服务器AdminServer, 与计算机Machine-0相关联的节点管理器无法访问. 所有所选服务器当前都处于与此操作不兼容的状态, 或未与运行的节点管理器关联, 或 ... 
- (转) 修改weblogic部署的应用名称
			通过weblogic管理后台console进行发布本地项目的时候,它会默认以WEB-INF的上一级目录作为访问路径, 如,假如你的项目WEB-INF目录的上一层是WebRoot,那么发布后, 访问的路 ... 
- SOA,Webservice,SOAP,REST,RPC,RMI,JMS的区别与联系(转载)
			原文地址:http://blog.csdn.net/pcceo1/article/details/51245249 SOA面向服务的软件架构(Service Oriented Architecture ... 
- Python Web 服务开发者: 第 1 部分
			Python Web 服务开发者: 第 1 部分 Python Web 服务世界 Python 的座右铭一向是“装备齐全”,这是指在安装该语言时会附带一大套标准库和功能程序.本文概述了在 Python ... 
- Quartz--Spring 定时任务
			一.quartz核心概念 先来看一张图: scheduler 任务调度器 trigger 触发器,用于定义任务调度时间规则 job 任务,即被调度的任务 misfire 错过的,指本来应该被 ... 
- U盘安装linux(CentOS Kali ubuntu)无法挂载_实测
			最新的Kali linux官方下载地址: https://www.kali.org/downloads/ 刻录软件官网:http://rufus.ie/ 1.打开. 2.插入U盘. 3.自动下载插件. ... 
- 【NOIP2016提高A组模拟9.17】小a的强迫症
			题目 分析 题目要求第i种颜色的最后一个珠子要在第i+1种颜色的最后一个珠子之前, 那么我们从小到大枚举做到第i种,把第i种的最后一颗珠子取出,将剩下的\(num(i)-1\)个珠子插入已排好的前i- ... 
- ROM和RAM的内存详细说明
			1.首先是ROM 的读取是需要提前两个地址的读取,所以要想读取0地址的数据,你需要给地址是2 2.关于宽度,深度的计算 假设我们要存取如下取模的数据,该模的设置口语描述为:这是显示的2个字节,其中一个 ... 
