生命游戏

  1. 题目描述
  2. 康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。
  3. 这个游戏在一个无限大的2D网格上进行。
  4. 初始时,每个小方格中居住着一个活着或死了的细胞。
  5. 下一时刻每个细胞的状态都由它周围八个格子的细胞状态决定。
  6. 具体来说:
  7. 1. 当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟生命数量稀少)
  8. 2. 当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
  9. 3. 当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
  10. 4. 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)
  11. 当前代所有细胞同时被以上规则处理后, 可以得到下一代细胞图。按规则继续处理这一代的细胞图,可以得到再下一代的细胞图,周而复始。
  12. 例如假设初始是:(X代表活细胞,.代表死细胞)
  13. .....
  14. .....
  15. .XXX.
  16. .....
  17. 下一代会变为:
  18. .....
  19. ..X..
  20. ..X..
  21. ..X..
  22. .....
  23. 康威生命游戏中会出现一些有趣的模式。例如稳定不变的模式:
  24. ....
  25. .XX.
  26. .XX.
  27. ....
  28. 还有会循环的模式:
  29. ...... ...... ......
  30. .XX... .XX... .XX...
  31. .XX... .X.... .XX...
  32. ...XX. -> ....X. -> ...XX.
  33. ...XX. ...XX. ...XX.
  34. ...... ...... ......
  35. 本题中我们要讨论的是一个非常特殊的模式,被称作"Gosper glider gun"
  36. ......................................
  37. .........................X............
  38. .......................X.X............
  39. .............XX......XX............XX.
  40. ............X...X....XX............XX.
  41. .XX........X.....X...XX...............
  42. .XX........X...X.XX....X.X............
  43. ...........X.....X.......X............
  44. ............X...X.....................
  45. .............XX.......................
  46. ......................................
  47. 假设以上初始状态是第0代,请问第1000000000(十亿)代一共有多少活着的细胞?
  48. 注意:我们假定细胞机在无限的2D网格上推演,并非只有题目中画出的那点空间。
  49. 当然,对于遥远的位置,其初始状态一概为死细胞。
  50. 注意:需要提交的是一个整数,不要填写多余内容。
  1. package 生命游戏;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Map;

import java.util.Scanner;

public class Main {

//文件终止符问题, 点出去再点进来,无语。。。。。

static int[][] dir = {{1,-1},{1,1},{-1,1},{-1,-1},{0,1},{0,-1},{1,0},{-1,0}};

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

Map<Integer, HashSet> lifemap = new HashMap<>();//记录本轮生命体

Map<Integer, HashSet> nmap = new HashMap<>();//记录下一轮生命体

Map<Integer, HashSet> visit = new HashMap<>();//在每一轮中记录是否被访问过

//初始化

int row = 0;//y的值

String str;

//处理输入

while(sc.hasNext()) {

str = sc.nextLine();

for(int x = 0; x < str.length(); x++) {

if(str.charAt(x) == ‘X’) {

if(lifemap.containsKey(x)) {//把这个点加到map里

lifemap.get(x).add(row);

}else {

HashSet nset = new HashSet<>();

nset.add(row);

lifemap.put(x, nset);

}

}

}

row++;

}

int fans = 0;

for(Integer x : lifemap.keySet()) {

for(Integer y : lifemap.get(x)) {

//System.out.println(x + " " + y);

fans++;

}

}

System.out.println(fans);

//模拟游戏

int cnt = 0;

while(cnt < 100) {

for(Integer x : lifemap.keySet()) {//第一轮

for(Integer y : lifemap.get(x)) {

  1. if(visit.containsKey(x)) //在某个点周围被先访问了,直接跳过
  2. if(visit.get(x).contains(y))
  3. continue;
  4. if(visit.containsKey(x)) {//把这个点标记已访问
  5. visit.get(x).add(y);
  6. }else {
  7. HashSet<Integer> nset = new HashSet<>();
  8. nset.add(y);
  9. visit.put(x, nset);
  10. }
  11. int num = 0;
  12. //System.out.print(x + " " + y + " : ");
  13. for(int[] d : dir) {//周围八个点,第一层
  14. int curx = x + d[0];
  15. int cury = y + d[1];
  16. boolean alive = false;
  17. if(lifemap.containsKey(curx))
  18. if(lifemap.get(curx).contains(cury)) {
  19. num++;
  20. alive = true;
  21. }
  22. if(alive)
  23. continue;
  24. //System.out.print(curx + " " + cury + " : ");
  25. if(visit.containsKey(curx)) //如果被访问过,就跳过这个点
  26. if(visit.get(curx).contains(cury))
  27. continue;
  28. if(visit.containsKey(curx)) {//把这个点标记已访问
  29. visit.get(curx).add(cury);
  30. }else {
  31. HashSet<Integer> nset = new HashSet<>();
  32. nset.add(cury);
  33. visit.put(curx, nset);
  34. }
  35. int cnum = 0;
  36. for(int[] cd : dir) {//周围8个点,第二层
  37. int cx = curx + cd[0];
  38. int cy = cury + cd[1];
  39. if(lifemap.containsKey(cx))
  40. if(lifemap.get(cx).contains(cy)) {
  41. cnum++;
  42. }
  43. }
  44. //System.out.print(cnum);
  45. //System.out.println();
  46. if(cnum == 3) {
  47. if(nmap.containsKey(curx)) {//把这个点加到map里
  48. nmap.get(curx).add(cury);
  49. }else {
  50. HashSet<Integer> nset = new HashSet<>();
  51. nset.add(cury);
  52. nmap.put(curx, nset);
  53. }
  54. }
  55. }
  56. //System.out.print(num);
  57. //System.out.println();
  58. if(num < 2) {
  59. ;
  60. }else if(num >=2 && num <= 3) {
  61. if(nmap.containsKey(x)) {
  62. nmap.get(x).add(y);
  63. }else {
  64. HashSet<Integer> nset = new HashSet<>();
  65. nset.add(y);
  66. nmap.put(x, nset);
  67. }
  68. }else{
  69. ;
  70. }
  71. }
  72. }
  73. lifemap = new HashMap<>();
  74. lifemap.putAll(nmap);
  75. nmap.clear();
  76. visit.clear();
  77. cnt++;
  78. int ans = 0;
  79. for(Integer x : lifemap.keySet()) {
  80. for(Integer y : lifemap.get(x)) {
  81. //System.out.println(x + " " + y);
  82. ans++;
  83. }
  84. }
  85. System.out.println(ans);
  86. }
  87. sc.close();
  88. }

}

java实现第八届蓝桥杯生命游戏的更多相关文章

  1. Java实现 蓝桥杯 生命游戏

    标题:生命游戏 康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 这个游戏在一个无限大的2D网格上进行. 初始时,每个小方格中居住着一个活着或死了的细胞. 下一时刻每个细胞的状态 ...

  2. Java实现第八届蓝桥杯购物单

    购物单 题目描述 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打 ...

  3. java实现第三届蓝桥杯火柴游戏

    火柴游戏 [编程题](满分34分) 这是一个纵横火柴棒游戏.如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒.其规则是: 不能放置在已经放置火柴棒的地方(即只能在空格中放置). 火柴棒的 ...

  4. Java实现第八届蓝桥杯拉马车

    拉马车 题目描述 小的时候,你玩过纸牌游戏吗? 有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友. 其规则简述如下: 假设参加游戏的小朋友是A和B,游戏开始的时候,他们得到的 ...

  5. Java实现第八届蓝桥杯国赛 数字划分

    标题:数字划分 w星球的长老交给小明一个任务: 1,2,3-16 这16个数字分为两组. 要求: 这两组数字的和相同, 并且,两组数字的平方和也相同, 并且,两组数字的立方和也相同. 请你利用计算机的 ...

  6. Java实现第八届蓝桥杯图形排版

    标题:图形排版 小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi. 假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版: 1. 该工具会按照 ...

  7. Java实现第八届蓝桥杯魔方状态

    魔方状态 题目描述 二阶魔方就是只有2层的魔方,只由8个小块组成. 如图p1.png所示. 小明很淘气,他只喜欢3种颜色,所有把家里的二阶魔方重新涂了颜色,如下: 前面:橙色 右面:绿色 上面:黄色 ...

  8. Java实现第八届蓝桥杯青蛙跳杯子

    青蛙跳杯子 题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里 ...

  9. Java实现第八届蓝桥杯兴趣小组

    兴趣小组 为丰富同学们的业余文化生活,某高校学生会创办了3个兴趣小组 (以下称A组,B组,C组). 每个小组的学生名单分别在[A.txt],[B.txt]和[C.txt]中. 每个文件中存储的是学生的 ...

随机推荐

  1. C++内存管理学习笔记(2)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  2. 2018-06-24 js BOM对象

    BOM对象: Browser Object Model 即浏览器对象模型: 包含: window:窗口对象 alert();//警示框 confirm();//确认框 prompt();//输入提示框 ...

  3. docer run 、docker attach 与 docker exec的区别

    进入容器的方式有以下三种: 使用ssh登陆进容器 使用nsenter.nsinit等第三方工具 使用Docker本身提供的工具 最佳方案为使用Docker本身提供的工具 docker run:创建和启 ...

  4. 【雕爷学编程】Arduino动手做(58)---SR04超声波传感器

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  5. JetBrains PyCharm 2018.2.4 x64 工具里如何安装bs4

    第一步:点击File->Settings 第二步:选择Project:workplace-->Project Interpreter,然后再点击右上角的"+"按钮进入下 ...

  6. SourceTree 3.1.3 版本跳过bitbucket注册方法(亲测好用)

    1.首先下载并安装好git程序. 2.接着下载并执行SourceTreeSetup-3.1.3.exe,会进入登录或注册bitbucket的界面,我只是想用软件,并不想去注册账号.怎么办?请往下看. ...

  7. Django路由之url分组(命名)匹配

    分组(命名)匹配 urls.py路由配置文件中: urlspatterns中想捕获正则表达式匹配的结果用来出传递给views.py视图函数文件使用,需要用到分组匹配,或者使用第三个参数python字典 ...

  8. Apache Module mod_reqtimeout

    Apache Module mod_reqtimeout Available Languages: en Description: Set timeout and minimum data rate ...

  9. 二、HTML基础标签4个

    标题标签<h1> —— <h6> <!DOCTYPE html> <html> <head> <meta charset=" ...

  10. Poj1753 翻转棋子

    这个题就是用枚举举遍所有情况,然后一个一个深搜看看是不是符合条件,符合条件直接退出,不符合则继续, 由于表格只有16个所以可以得知最多的步数只能是16,所以可以根据步数从0到16依次枚举, 第一个符合 ...