期末考试编程题

返回
 

这是期末考试的编程题

温馨提示:

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
 
  1. import java.util.Scanner;
  2.  
  3. public class CellMachine {
  4. static Scanner in = new Scanner(System.in);
  5. static int width = 0;// 宽度
  6. static int height = 0;// 高度
  7. static int[][] field_old;// 旧的网格
  8. static int[][] field_new;// 新的网格
  9. static int times;// 步数
  10.  
  11. public static void main(String[] args) {
  12. // 首先输入两个正整数,范围为[3,102],依次表示网格的宽度和高度。
  13. width = in.nextInt();
  14. height = in.nextInt();
  15.  
  16. // 初始化数组
  17. initial();
  18.  
  19. // 然后,以一个正整数,范围为[1,10000],表示要求细胞自动机执行的步数。
  20. times = in.nextInt();
  21.  
  22. // 细胞自动机执行
  23. run(times);
  24.  
  25. System.out.println(count(field_old));// 输出一个正整数,表示执行完毕后,剩下的活着的细胞的数量。
  26. }
  27.  
  28. // 初始化数组
  29. public static void initial() {
  30. field_old = new int[height][width];
  31. field_new = new int[height][width];
  32.  
  33. for (int i = 0; i < field_old.length; i++) {
  34. for (int j = 0; j < field_old[i].length; j++) {
  35. field_old[i][j] = 0;
  36. field_new[i][j] = 0;
  37. }
  38. }
  39.  
  40. // 然后输入多组正整数,依次表示一个活着的细胞的网格位置,每组数字中,第一个表示行号,第二个表示列号,均从0开始编号。
  41. while (true) {
  42. int i = in.nextInt();
  43. int j = in.nextInt();
  44.  
  45. if (i == -1 && j == -1) {
  46. break;// 最后,以“-1 -1”表示不再有活着的细胞。-1 -1不是有效的位置。
  47. }
  48.  
  49. field_old[i][j] = 1;
  50. field_new[i][j] = 1;
  51. }
  52. }
  53.  
  54. // 细胞自动机执行
  55. public static void run(int times) {
  56. int number = 0;
  57.  
  58. for (int i = 0; i < times; i++) {
  59. for (int j = 0; j < field_old.length; j++) {
  60. for (int k = 0; k < field_old[j].length; k++) {
  61. number = getNeighbour(j, k);// 计算周围活着的细胞
  62.  
  63. if (field_old[j][k] == 1 && (number == 2 || number == 3)) {
  64. field_new[j][k] = 1;
  65. } else {
  66. field_new[j][k] = 0;
  67. }
  68.  
  69. if (field_old[j][k] == 0 && number == 3) {
  70. field_new[j][k] = 1;
  71. }
  72. }
  73. }
  74.  
  75. for (int j = 0; j < field_new.length; j++) {
  76. for (int k = 0; k < field_new[j].length; k++) {
  77. field_old[j][k] = field_new[j][k];// 把新的复制到旧的
  78. }
  79. }
  80. }
  81. }
  82.  
  83. // 计算周围活着的细胞
  84. public static int getNeighbour(int i, int j) {
  85. int number = 0;
  86.  
  87. if (i == 0 && j == 0) {// 左上角
  88. number = field_old[i][j + 1] + field_old[i + 1][j + 1] + field_old[i + 1][j];
  89. } else if (i == 0 && j == width - 1) {// 右上角
  90. number = field_old[i][j - 1] + field_old[i + 1][j - 1] + field_old[i + 1][j];
  91. } else if (i == height - 1 && j == 0) {// 左下角
  92. number = field_old[i - 1][j] + field_old[i - 1][j + 1] + field_old[i][j + 1];
  93. } else if (i == height - 1 && j == width - 1) {// 右下角
  94. number = field_old[i - 1][j] + field_old[i - 1][j - 1] + field_old[i][j - 1];
  95. } else if (i == 0) {// 首行其他
  96. number = field_old[i][j - 1] + field_old[i + 1][j - 1] + field_old[i + 1][j] + field_old[i + 1][j + 1]
  97. + field_old[i][j + 1];
  98. } else if (i == height - 1) {// 末行其他
  99. number = field_old[i][j - 1] + field_old[i - 1][j - 1] + field_old[i - 1][j] + field_old[i - 1][j + 1]
  100. + field_old[i][j + 1];
  101. } else if (j == 0) {// 最左其他
  102. number = field_old[i - 1][j] + field_old[i - 1][j + 1] + field_old[i][j + 1] + field_old[i + 1][j + 1]
  103. + field_old[i + 1][j];
  104. } else if (j == width - 1) {// 最右其他
  105. number = field_old[i - 1][j] + field_old[i - 1][j - 1] + field_old[i][j - 1] + field_old[i + 1][j - 1]
  106. + field_old[i + 1][j];
  107. } else {// 其他
  108. number = field_old[i - 1][j - 1] + field_old[i - 1][j] + field_old[i - 1][j + 1] + field_old[i][j + 1]
  109. + field_old[i + 1][j + 1] + field_old[i + 1][j] + field_old[i + 1][j - 1] + field_old[i][j - 1];
  110. }
  111.  
  112. return number;
  113. }
  114.  
  115. // 剩下的活着的细胞的数量
  116. public static int count(int[][] field) {
  117. int number = 0;
  118.  
  119. for (int i = 0; i < field.length; i++) {
  120. for (int j = 0; j < field[i].length; j++) {
  121. if (field[i][j] == 1) {
  122. number++;
  123. }
  124. }
  125. }
  126.  
  127. return number;
  128. }
  129. }

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

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

    第3周编程题 查看帮助 返回   第3周编程题.注意程序(包括注释)中不能出现汉字. 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后 ...

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

    第2周编程题 查看帮助 返回   第2周编程题,在课程所给的时钟程序的基础上修改 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系 ...

  3. 中国MOOC_面向对象程序设计——Java语言_第1周 类与对象

    第1周编程题 查看帮助 返回   我们在题目说明中给出了一部分代码,你需要在这部分代码的基础上,按照题目说明编写代码,然后将两部分代码一起提交. 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨 ...

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

    第2周编程题 查看帮助 返回   第2周编程题,在课程所给的时钟程序的基础上修改 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系 ...

  5. 中国MOOC_面向对象程序设计——Java语言_第1周 类与对象_1分数

    第1周编程题 查看帮助 返回   我们在题目说明中给出了一部分代码,你需要在这部分代码的基础上,按照题目说明编写代码,然后将两部分代码一起提交. 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨 ...

  6. 中国MOOC_面向对象程序设计——Java语言_第4章 继承与多态_第4周编程题_将MP3媒体类型存放进Database

    本周我们介绍了以继承方式实现的媒体资料库,在课程代码实现的基础上,请实现一个表达MP3的媒体类型,能和CD.DVD一样存放进这个Database.请提交这个MP3类的代码.如果你认为为了能存放MP3, ...

  7. 面向对象程序设计--Java语言第三周编程题:查找里程

    查找里程 题目内容: 下图为国内主要城市之间的公路里程: 你的程序要读入这样的一张表,然后,根据输入的两个城市的名称,给出这两个城市之间的里程. 注意:任何两个城市之间的里程都已经给出,不需要计算经第 ...

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

    1 字数统计(10分) 题目内容: 你的程序要读入一篇英文文章,然后统计其中的单词数来输出.需要统计的数据为: 总的单词数量: 含有1个字母到10个字母的单词的数量. 单词和单词的间隔是由以下标点符号 ...

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

    期末考试的编程题 返回   这是期末考试的编程题,在60分钟内,你可以多次提交,直到正确为止. 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止 ...

随机推荐

  1. Maven项目构建利器02——安装Maven核心程序

    1.Maven也是用Java编写的工具,同样运行在JVM上,所以我们在安装Maven之前需要确保已经安装了JDK,首先来检查电脑上是否安装JDK. 2.如上图说明电脑中已经安装了JDK,下面就要去官网 ...

  2. 配置 http 反向代理

    [root@nginx ~]# cd /etc/nginx/ 1 [root@nginx nginx]# cp nginx.conf nginx.conf.bak #备份一个原配置文件 2 [root ...

  3. excle 文件的导入和导出

    //excle 文件导出 public function excel(){ try{ include(BASE_PATH."Excel/PHPExcel.php"); // ech ...

  4. windows pip使用国内源

    在这里我使用清华源来做示范 win+R 打开用户目录%HOMEPATH%,在此目录下创建 pip 文件夹,在 pip 目录下创建 pip.ini 文件, 内容如下, 在pip文件夹里新建的pip.in ...

  5. docker命令(随时补充)

    导入导出容器:https://blog.csdn.net/LEoe_/article/details/78685156 拷贝文件到容器内:docker cp 本地路径 容器长ID:容器路径

  6. Educational Codeforces Round 77 比赛总结

    比赛情况 我太菜了 A题 加减乘除不会 B题 二元一次方程不会 C题 gcd不会 就会一个D题二分答案大水题,本来想比赛最后一分钟来一个绝杀,结果 Wrong Answer on test 4 比赛总 ...

  7. 用小程序做一个类似于苹果AssistiveTouch功能

    一.首先我先介绍一下,我们要做一个什么样的项目功能 项目功能就是一个音频点击播放,当点击为播放的状态时,一个音频的动图出现,而且是可以跟随着手指的滑动而滑动,而且,在滑动动图的时候,当前下的页面是不可 ...

  8. sourceTree 添加 ssh key 方法

    1.使用 git 客户的生成公私钥:id_rsa.id_rsa.pub 1.1设置Git的user name和email: $ git config --global user.name " ...

  9. jquery lt选择器 语法

    jquery lt选择器 语法 作用::lt 选择器选取带有小于指定 index 值的元素.index 值从 0 开始.经常与其他元素/选择器一起使用,来选择指定的组中特定序号之前的元素(如上面的例子 ...

  10. sh_05_函数的参数

    sh_05_函数的参数 def sum_2_num(num1, num2): """对两个数字的求和""" # num1 = 10 # nu ...