标题:生命游戏

康威生命游戏是英国数学家约翰·何顿·康威在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网格上推演,并非只有题目中画出的那点空间。

当然,对于遥远的位置,其初始状态一概为死细胞。

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

PS:像这种什么十亿后是什么的一看就知道不能按照他的思路做,肯定有循环,或者有一些其他的捷径,慢慢摸索,

千万不要被题目吓住,慢慢读题,细细品他

package 第三次模拟;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; class Point{ //代表细胞 public int x; //行
public int y; //列 public Point(int x,int y){
this.x=x;
this.y=y;
} @Override
public boolean equals(Object obj) {
Point newPoint=(Point)obj;
return this.x==newPoint.x && this.y==newPoint.y;
}
} static int row=11;
static int rank=38;
static List<Integer> saveCellNum=new ArrayList<Integer>(); //存放每一代的细胞数
static List<Point> livingCell=new ArrayList<Point>(); //存放活细胞
static List<Point> nextLivingCell; //存放下一代的活细胞
static int dirX[]={-1,-1,-1,0,0,1,1,1}; //八个方向,左上、上、右上、左、右、左下、下、右下
static int dirY[]={-1,0,1,-1,1,-1,0,1}; public static void main(String args[]){ Scanner reader=new Scanner(System.in);
char tmp[][]=new char[row][rank];
for(int i=0;i<row;i++){
String str=reader.nextLine();
tmp[i]=str.toCharArray();
}
//加入活细胞
for(int i=0;i<row;i++){
for(int j=0;j<rank;j++){
if(tmp[i][j]=='X'){
livingCell.add(new Point(i,j));
}
}
}
saveCellNum.add( new Integer(livingCell.size()) ); //加入第0代活细胞数目 for(int loop=1;loop<=300;loop++){ //循环100次观察规律
nextLivingCell=new ArrayList<Point>();
for(int i=0;i<livingCell.size();i++){ //遍历当前代的所有活细胞
Point curPoint=(Point)livingCell.get(i);
int nigorCells=0; //周围八个细胞的存活数目
for(int j=0;j<8;j++){
int dx=curPoint.x+dirX[j];
int dy=curPoint.y+dirY[j];
if(livingCell.contains(new Point(dx,dy))){
nigorCells++;
}else{ //只有在活细胞旁边的死亡细胞才存在存活的可能
if(!nextLivingCell.contains(new Point(dx,dy))){ //需要注意,不同的活细胞周围可能存在同一个死亡细胞
int nigorhPoint=0;
for(int k=0;k<8;k++){ //同样判断此白细胞
int dxx=dx+dirX[k];
int dyy=dy+dirY[k];
if(livingCell.contains(new Point(dxx,dyy))){
nigorhPoint++;
}
}
if(nigorhPoint==3){ //死亡细胞复活
nextLivingCell.add(new Point(dx,dy));
}
}
}
}
if(nigorCells==2 || nigorCells==3){ //活细胞延续
nextLivingCell.add(curPoint);
}
}
//至此上一代的已经更新完毕
saveCellNum.add(new Integer(nextLivingCell.size()));
livingCell=nextLivingCell;
}
for(int i=0;i<saveCellNum.size();i++){
System.out.print(saveCellNum.get(i)+" ");
}
System.out.println();
for(int i=1;i<saveCellNum.size();i++){
System.out.print(saveCellNum.get(i)-saveCellNum.get(i-1)+" ");
}
} }

按照这个规律出来的前300个结果

/*
* ......................................
.........................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.......................
......................................
39 43 48 51 44 51 48 61 42 48 50 54 55 56 42 44 47 53 54 54 54 49 60 43 50 47 47 50 48 41 44 48 53 56 49 56 53 66 47 53 55 59 60 61 47 49 52 58 59 59 59 54 65 48 55 52 52 55 53 46 49 53 58 61 54 61 58 71 52 58 60 64 65 66 52 54 57 63 64 64 64 59 70 53 60 57 57 60 58 51 54 58 63 66 59 66 63 76 57 63 65 69 70 71 57 59 62 68 69 69 69 64 75 58 65 62 62 65 63 56 59 63 68 71 64 71 68 81 62 68 70 74 75 76 62 64 67 73 74 74 74 69 80 63 70 67 67 70 68 61 64 68 73 76 69 76 73 86 67 73 75 79 80 81 67 69 72 78 79 79 79 74 85 68 75 72 72 75 73 66 69 73 78 81 74 81 78 91 72 78 80 84 85 86 72 74 77 83 84 84 84 79 90 73 80 77 77 80 78 71 74 78 83 86 79 86 83 96 77 83 85 89 90 91 77 79 82 88 89 89 89 84 95 78 85 82 82 85 83 76 79 83 88 91 84 91 88 101 82 88 90 94 95 96 82 84 87 93 94 94 94 89 100 83 90 87 87 90 88 81 84 88 93 96 89 96 93 106 87 93 95 99 100 101 87 89 92 98 99 99 99 94 105 88 95 92 92 95 93 86
4 5 3 -7 7 -3 13 -19 6 2 4 1 1 -14 2 3 6 1 0 0 -5 11 -17 7 -3 0 3 -2 -7 3 4 5 3 -7 7 -3 13 -19 6 2 4 1 1 -14 2 3 6 1 0 0 -5 11 -17 7 -3 0 3 -2 -7 3 4 5 3 -7 7 -3 13 -19 6 2 4 1 1 -14 2 3 6 1 0 0 -5 11 -17 7 -3 0 3 -2 -7 3 4 5 3 -7 7 -3 13 -19 6 2 4 1 1 -14 2 3 6 1 0 0 -5 11 -17 7 -3 0 3 -2 -7 3 4 5 3 -7 7 -3 13 -19 6 2 4 1 1 -14 2 3 6 1 0 0 -5 11 -17 7 -3 0 3 -2 -7 3 4 5 3 -7 7 -3 13 -19 6 2 4 1 1 -14 2 3 6 1 0 0 -5 11 -17 7 -3 0 3 -2 -7 3 4 5 3 -7 7 -3 13 -19 6 2 4 1 1 -14 2 3 6 1 0 0 -5 11 -17 7 -3 0 3 -2 -7 3 4 5 3 -7 7 -3 13 -19 6 2 4 1 1 -14 2 3 6 1 0 0 -5 11 -17 7 -3 0 3 -2 -7 3 4 5 3 -7 7 -3 13 -19 6 2 4 1 1 -14 2 3 6 1 0 0 -5 11 -17 7 -3 0 3 -2 -7 3 4 5 3 -7 7 -3 13 -19 6 2 4 1 1 -14 2 3 6 1 0 0 -5 11 -17 7 -3 0 3 -2 -7
*
* */

这里我们可以看出来,有循环,虽然出来的数量是没有循环的,但是他的递增递减是由循环的

那么o(* ̄▽ ̄*)ブ

public class Demo8生命游戏 {

    public static void main(String args[]){

        int a[]={3, 4 ,5 ,3 ,-7, 7, -3 ,13 ,-19, 6, 2 ,4 ,1, 1, -14, 2 ,3 ,6, 1, 0, 0 ,-5 ,11, -17, 7 ,-3 ,0,3 ,-2, -7};
int sum=0;
for(int i=0;i<a.length;i++){
sum+=a[i];
}
System.out.println(sum);
int k=0;
k=(1000000000/30)*sum+36; int b[]=new int[1000000000%30];
for(int i=0;i<b.length;i++){
b[i]=a[i];
k+=b[i];
}
System.out.println(k);
}
}

Java实现 蓝桥杯 生命游戏的更多相关文章

  1. java实现第八届蓝桥杯生命游戏

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

  2. Java实现 蓝桥杯 数独游戏

    你一定听说过"数独"游戏. 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一 ...

  3. 日期求星期(java)-蓝桥杯

    日期求星期问题(java)-蓝桥杯 1:基姆拉尔森计算公式(计算星期) 公式: int week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 此处y,m,d指代年 ...

  4. Java实现 蓝桥杯VIP 基础练习 高精度加法

    java算法 蓝桥杯 高精度加法 问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数 ...

  5. Java实现 蓝桥杯 算法提高 进攻策略加强(暴力)

    试题 算法提高 进攻策略加强 问题描述 植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物. 首先,僵尸有m种(每种僵尸都是无限多的),玩家可以选择合适的僵尸来进攻.使用第i种僵尸需要 ...

  6. Java实现 蓝桥杯VIP 基础练习 Sine之舞

    问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能力 ...

  7. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  8. java算法 蓝桥杯 扶老奶奶街

    一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...

  9. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

随机推荐

  1. spark on yarn安装

    网上关于spark的安装说明很多了,这里就以spark  pre-build with user provided hadoop 安装包为例讲解, 下载spark  pre-build with us ...

  2. springDataJPQL实现增删改查及分页,原生sql查询,根据方法命名规则实现查询以及Specification查询

    一.使用方法 1.在dao中定义开一个方法,使用方法的参数设置jpql,并且使用方法的返回值接受查询结果,在方法上添加@query注解,在注解中写jpql语句进行增删改查,测试 2.使用原生的sql语 ...

  3. Docker之镜像地址

    转载自https://www.cnblogs.com/doraman/p/9570891.html 官方docker hub 官方:https://hub.docker.com/explore/ 常用 ...

  4. Spark aggregateByKey函数

    aggregateByKey与aggregate类似,都是进行两次聚合,不同的是后者只对分区有效,前者对分区中key进一步细分 def aggregateByKey[U: ClassTag](zero ...

  5. VIOS挂载ISO文件

    6.VIOS挂载ISO文件 1.给vhost建立虚拟设备 mkvdev -vadapter vhostX -fbo -dev cdx 2.建立存放ISO的资料库 mkrep -sp rootvg -s ...

  6. python3.x 基础八:socket网络编程

    Socket socket就是一直以来说的“套接字”,用于描述:ip:端口,是通信链的句柄,客户端通过这个句柄进行请求和响应 普通文件的操作顺序:打开-读写-关闭,针对的是文件 socket是特殊的文 ...

  7. unity---string.Format()

    string.Format用法 string.Format("{0}{1}{2}",str1,str2,str3) string.Format("{0:D2}{1:D2} ...

  8. Align Content Properties

    How to align the items of the flexible element? <!DOCTYPE html> <html lang="en"&g ...

  9. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)

    上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...

  10. JAVA局部变量和成员变量的区别

    成员变量与局部变量的区别 1.在类中的位置不同 成员变量:在类中方法外面 局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中) 2.在内存中的位置不同 成员变量:在堆中(方法区中的静态区) ...