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

期末考试编程题

返回

这是期末考试的编程题

温馨提示:

1.本次考试属于Online Judge题目,提交后由系统即时判分。

2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩。

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;
	}
}
时间: 06-22

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

中国MOOC_面向对象程序设计——Java语言_第2周 对象交互_1有秒计时的数字时钟

第2周编程题 查看帮助 返回 第2周编程题,在课程所给的时钟程序的基础上修改 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 1 有秒计时的数字时钟(10分) 题目内容: 这一周的编程题是需要你在课程所给的时钟程序的基础上修改而成.但是我们并不直接给你时钟程序的代码,请根据视频自己输入时钟程序的Display和Clock类的代码,

中国MOOC_面向对象程序设计——Java语言_第3周 对象容器_1查找里程

第3周编程题 查看帮助 返回 第3周编程题.注意程序(包括注释)中不能出现汉字. 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 1 查找里程(10分) 题目内容: 题目内容: 下图为国内主要城市之间的公路里程: 你的程序要读入这样的一张表,然后,根据输入的两个城市的名称,给出这两个城市之间的里程. 注意:任何两个城市之间的里程都

网易云课堂_程序设计入门-C语言_期末考试编程题

1 字数统计(10分) 题目内容: 你的程序要读入一篇英文文章,然后统计其中的单词数来输出.需要统计的数据为: 总的单词数量: 含有1个字母到10个字母的单词的数量. 单词和单词的间隔是由以下标点符号形成的:空格.tab.回车换行.逗号.句号.问号.括号.双引号和冒号.这些符号不能被计入单词的长度中. 因此,对于下面的句子: "What you see is a very hefty response," said CNN Aviation Correspondent Rene Mar

中国MOOC_零基础学Java语言_期末考试的编程题_1二进制的前导的零

期末考试的编程题 返回 这是期末考试的编程题,在60分钟内,你可以多次提交,直到正确为止. 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 二进制的前导的零(10分) 题目内容: 计算机内部用二进制来表达所有的值.一个十进制的数字,比如18,在一个32位的计算机内部被表达为00000000000000000000000000011000.可以看到,从左边数过来,在第一个1之前,有27

网易云课堂_C语言程序设计进阶_期末考试编程题部分

123123 1 字符串循环右移(5分) 题目内容: 输入一个字符串和一个非负整数N,要求将字符串循环右移N次. 输入格式: 输入在第1行中给出一个字符串,以'#'表示结束,‘#’不是字符串的一部分,字符串的长度未知,但至少有一个字符:输入的第2行给出非负整数N. 输出格式: 在一行中输出循环右移N次后的字符串. 输入样例: Hello World!# 2 输出样例: d!Hello Worl 时间限制:500ms内存限制:32000kb 2 最小包围矩形(5分) 题目内容: 给定一组二维坐标,

中国MOOC_零基础学Java语言_第7周 函数_1分解质因数

第7周编程题 查看帮助 返回 第7周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 1 分解质因数(5分) 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在,你的程序要读入一个[2,10000

有秒计时的数字时钟(MOOC面向对象程序设计--Java语言)

有秒计时的数字时钟 题目内容: 这一周的编程题是需要你在课程所给的时钟程序的基础上修改而成.但是我们并不直接给你时钟程序的代码,请根据视频自己输入时钟程序的Display和Clock类的代码,然后来做这个题目. 我们需要给时钟程序加上一个表示秒的Display,然后为Clock增加以下public的成员函数: public Clock(int hour, int minute, int second); 用hour, minute和second初始化时间. public void tick();

程序设计入门—Java语言 第六周编程题 1 单词长度(4分)

第六周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 1 单词长度(4分) 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本中每个单词的长度.这里的单词与语言无关,可以包括各种符号,比如"it's"算一个单词,长度为4.注意,行中可能出现连续的空格. 输入格式: 输入在一行中给出一行文本,以'.'结束,结尾的句号不能计算在最后一个单词的长度内. 输出格式: 在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后

网易云课堂_C++程序设计入门(下)_期末考试_期末考试在线编程题目

期末考试在线编程题目 返回考试 本次考试题目一共两个,在考试期间可以不限制次数地提交 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 编写一个模板类型的 max 函数,求取三个输入的数据中最大的一个,将其输出(10分) 题目内容: 编写一个模板类型的max函数,该函数接收三个参数,返回其中最大的一个. 在主函数中接受键盘输入的三个数据(用空格分隔),并且将最大的一个值输出到屏幕上(