题目描述:

康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。  
这个游戏在一个无限大的2D网格上进行。

初始时,每个小方格中居住着一个活着或死了的细胞。
下一时刻每个细胞的状态都由它周围八个格子的细胞状态决定。

具体来说:

1. 当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟生命数量稀少)
2. 当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
3. 当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
4. 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)

当前代所有细胞同时被以上规则处理后, 可以得到下一代细胞图。按规则继续处理这一代的细胞图,可以得到再下一代的细胞图,周而复始。

例如假设初始是:(X代表活细胞,.代表死细胞)
.....
.....
.XXX.
.....

下一代会变为:
.....
..X..
..X..
..X..
.....

康威生命游戏中会出现一些有趣的模式。例如稳定不变的模式:

....
.XX.
.XX.
....

还有会循环的模式:

......      ......       ......
.XX...      .XX...       .XX...
.XX...      .X....       .XX...
...XX.   -> ....X.  ->   ...XX.
...XX.      ...XX.       ...XX.
......      ......       ......

本题中我们要讨论的是一个非常特殊的模式,被称作"Gosper glider gun":

......................................
.........................X............
.......................X.X............
.............XX......XX............XX.
............X...X....XX............XX.
.XX........X.....X...XX...............
.XX........X...X.XX....X.X............
...........X.....X.......X............
............X...X.....................
.............XX.......................
......................................

假设以上初始状态是第0代,请问第1000000000(十亿)代一共有多少活着的细胞?

注意:我们假定细胞机在无限的2D网格上推演,并非只有题目中画出的那点空间。
当然,对于遥远的位置,其初始状态一概为死细胞。

注意:需要提交的是一个整数,不要填写多余内容。

首先总结认真审题,总结题目的信息,知道细胞分死亡和存活两种状态,对于死亡的细胞只要周围(八个方向)存活细胞数等于3,则该细胞能恢复活性;而对于存活的细胞,周围存活细胞数小于2或者大于3则会死亡,周围存活细胞数等于2或者3才能存活。

思路:

鉴于这只是一道填空题,所以就不去考虑什么骚操作了,首先把"Gosper glider gun"存入记事本中,再读取来处理,用一个二维整形数组存储这个表,存活细胞记为 1,死亡细胞则记为 0。

然后再用一个LinkedList来存存活的细胞坐标位置,这样方便每一代更替时进行处理,毕竟只有当周围有存活细胞时,死亡细胞才有可能复活,然后就是不断循环重复对每个存活的细胞及其周边八个方向的死亡细胞进行判断,判断死亡细胞是否会复活,存活细胞是否会死亡。

得到其每一代的存活细胞数量,观察其细胞增长是否有规律。

代码如下:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;    public class Main {public static final int MAX_NUMBER = 1000;public static int[][] map = new int[MAX_NUMBER][MAX_NUMBER];public static int[][] tmpMap;public static int[][] beenCheck;public static LinkedList<coor> life = new LinkedList<coor>();public static final int[][] dir = new int[][] {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};//自定义的坐标类public static class coor {public int x;public int y;coor(int x, int y) {this.x = x;this.y = y;}}//判断当前存活细胞的去留public static void Judge(coor c) {int countLife = 0;for(int i = 0; i < dir.length; i++) {//周围的存活细胞if(map[c.x + dir[i][0]][c.y + dir[i][1]] == 1) {countLife++;}//周围的死亡细胞else {//尚未被检查过if(beenCheck[c.x + dir[i][0]][c.y + dir[i][1]] == 0) {int countDead = 0;int tmpR = c.x + dir[i][0];int tmpC = c.y + dir[i][1];//遍历该死亡细胞的八个方向for(int j = 0; j < dir.length; j++) {if(map[tmpR + dir[j][0]][tmpC + dir[j][1]] == 1) {countDead++;}}//周围细胞数为3,死亡细胞翻身if(countDead == 3) {tmpMap[tmpR][tmpC] = 1;life.addLast(new coor(tmpR, tmpC));}//该点被检查标志beenCheck[tmpR][tmpC] = 1;}}}//对当前细胞的生死去留判断if(countLife == 3 || countLife == 2) {life.addLast(c);tmpMap[c.x][c.y] = 1;}}public static void main(String[] args) throws IOException {File file = new File("C:\\Users\\vMars\\Desktop\\input\\in.txt");BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件String str = null;int row = 0;while((str = br.readLine()) != null) {System.out.println(str);//不要离边边太近,防止溢出int step = 10;for(int column = 0; column < str.length(); column++) {if(str.charAt(column) == 'X') {map[step + row][step + column] = 1;life.addLast(new coor(step+row, step+column));}else {map[step + row][step + column] = 0;}}row++;}//演变50代for(int i = 0; i <= 50; i++) {System.out.println(life.size());beenCheck= new int[MAX_NUMBER][MAX_NUMBER];tmpMap = new int[MAX_NUMBER][MAX_NUMBER];//记录当前的存活细胞个数int lifeSize = life.size();for(int j = 0; j < lifeSize; j++) {//这样就可以只判断当前存活的,而不影响后面经过判断得到新的存活细胞坐标(因为是尾插)Judge(life.getFirst());life.removeFirst();}map = tmpMap;}br.close();}
}

从上面代码可以得到该图形50代的繁殖数量变化情况,将其存到Excel表中观察分析。

可以发现该图的细胞繁殖数量每30代一次循环,且每30代净增长为5个存活细胞,所以可以通过计算器算:

1000000000  / 30 = 33333333.33333333

1000000000  % 30 = 10 ,通过表格计算可得,经过10代,净增长为 12

所以结果等于:33333333*5 + 36(第0代)+12 = 166666713

蓝桥杯------2017 Java B组 国赛:第二题 生命游戏相关推荐

  1. 2018年第九届蓝桥杯C/C++ C组国赛 —— 第二题:最大乘积

    标题:最大乘积 把 1~9 这9个数字分成两组,中间插入乘号, 有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次. 比如: 984672 * 351 = 345619872 987 ...

  2. 2018年第九届蓝桥杯C/C++ A组国赛 —— 第二题:阅兵方阵

    标题:阅兵方阵 x国要参加同盟阅兵活动. 主办方要求每个加盟国派出的士兵恰好能组成 2 个方阵. x国发现弱小的 y国派出了130人的队伍,他们的士兵在行进中可以变换2种队形: 130 = 81 + ...

  3. 2014年第五届蓝桥杯C/C++ A组国赛 —— 第二题:六角幻方

    标题:六角幻方 把 1 2 3 - 19 共19个整数排列成六角形状,如下: * * ** * * ** * * * ** * * * * * * 要求每个直线上的数字之和必须相等.共有15条直线哦! ...

  4. 2016年第七届蓝桥杯C/C++ C组国赛 —— 第二题:反幻方

    反幻方 我国古籍很早就记载着 2 9 4 7 5 3 6 1 8 这是一个三阶幻方.每行每列以及对角线上的数字相加都相等. 下面考虑一个相反的问题. 可不可以用 1~9 的数字填入九宫格. 使得:每行 ...

  5. 2013年第四届蓝桥杯C/C++ A组国赛 —— 第二题:骰子迷题

    标题:骰子迷题 小明参加了少年宫的一项趣味活动:每个小朋友发给一个空白的骰子(它的6个面是空白的,没有数字),要小朋友自己设计每个面写哪个数字.但有如下要求: 每个面只能填写 0 至 8 中的某一个数 ...

  6. 2017年第八届蓝桥杯C/C++ C组国赛 —— 第一题:哥德巴赫分解

    标题:哥德巴赫分解 哥德巴赫猜想认为:不小于4的偶数都可以表示为两个素数的和. 你不需要去证明这个定理,但可以通过计算机对有限数量的偶数进行分解,验证是否可行. 实际上,一般一个偶数会有多种不同的分解 ...

  7. 2017年第八届蓝桥杯C/C++ A组国赛 —— 第一题:平方十位数

    标题:平方十位数 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平方). 比如:1026753849,就是其中最小的一个平方数. 请你找出其中最大 ...

  8. 2016年第七届蓝桥杯C/C++ A组国赛 —— 第一题:随意组合

    标题:随意组合 小明被绑架到X星球的巫师W那里. 其时,W正在玩弄两组数据 (2 3 5 8) 和 (1 4 6 7) 他命令小明从一组数据中分别取数与另一组中的数配对,共配成4对(组中的每个数必被用 ...

  9. 2015年第六届蓝桥杯C/C++ B组国赛 —— 第一题:积分之迷

    标题:积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会返固定的积分. 小明开业第一天收到了三笔订单: 第一笔:3个A + 7个B + 1个C,共返积分:315 ...

最新文章

  1. 【UOJ574】多线程计算【二元二项式反演】【定积分】【矩阵】【NTT 卷积】
  2. 解决libreadline.so.6: cannot open shared object file: No such file or directory的问题
  3. 把对方陷入困境中(博弈论的诡计)
  4. left join条件放在on和where的区别
  5. [NLP]OpenNLP Maven工程的依赖
  6. vb.net 使用MD5密碼加密
  7. python测试工程师简历模板_测试工程师英文简历模板范文
  8. 在virtual box虚拟机上下载sniffer pro
  9. 数据中心“容灾”和“备份”的区别
  10. 反向题在测试问卷信效度_问卷一定要做信度效度检验吗?如果含有多选题怎样做信度分析,请各位高手帮帮忙。...
  11. 疫情肆虐下,程序员们都在哪里?
  12. Google Guava EventBus 消息发布-订阅异步调用使用
  13. VMware 17 Pro安装(升级)
  14. 争对让望对思野葛对山栀注解_中华经典名著《笠翁对韵》全文解释(上卷四支)...
  15. 如何从缓存白嫖网易云音乐
  16. 结合Flex Builder和Flash CS4制作一个中国地图的应用
  17. 数据可视化——pyecharts(地图)
  18. 以太网:权威指南 英文_信息图:创建网站的客户指南
  19. CSRF攻击原理及防御
  20. 《Aerosol Science and Technology》期刊介绍(SCI 3区)

热门文章

  1. 测试笔记:学习 sqlalchemy 框架
  2. Centos7 添加网卡
  3. mysql 表空间_mysql 表空间
  4. Python学习笔记19:列表 III
  5. node.js实现文件转换图片
  6. 用Affinity制作无缝贴图
  7. docker-01 docker-centos7-安装配置阿里元镜像加速
  8. android 屏幕录制方案,ShareREC for Android全系统录屏原理解析
  9. 港科夜闻|香港科大陈凯教授设计下一代人工智能计算中心,助力构建香港智慧城市...
  10. Dijkstra算法堆/优先队列优化