Java实现 蓝桥杯 生命游戏
标题:生命游戏
康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。
这个游戏在一个无限大的2D网格上进行。
初始时,每个小方格中居住着一个活着或死了的细胞。
下一时刻每个细胞的状态都由它周围八个格子的细胞状态决定。
具体来说:
- 当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟生命数量稀少)
- 当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
- 当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
- 当前细胞为死亡状态时,当周围有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实现 蓝桥杯 生命游戏的更多相关文章
- java实现第八届蓝桥杯生命游戏
生命游戏 题目描述 康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 这个游戏在一个无限大的2D网格上进行. 初始时,每个小方格中居住着一个活着或死了的细胞. 下一时刻每个细胞的 ...
- Java实现 蓝桥杯 数独游戏
你一定听说过"数独"游戏. 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一 ...
- 日期求星期(java)-蓝桥杯
日期求星期问题(java)-蓝桥杯 1:基姆拉尔森计算公式(计算星期) 公式: int week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 此处y,m,d指代年 ...
- Java实现 蓝桥杯VIP 基础练习 高精度加法
java算法 蓝桥杯 高精度加法 问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数 ...
- Java实现 蓝桥杯 算法提高 进攻策略加强(暴力)
试题 算法提高 进攻策略加强 问题描述 植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物. 首先,僵尸有m种(每种僵尸都是无限多的),玩家可以选择合适的僵尸来进攻.使用第i种僵尸需要 ...
- Java实现 蓝桥杯VIP 基础练习 Sine之舞
问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能力 ...
- java算法 蓝桥杯 乘法运算
问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...
- java算法 蓝桥杯 扶老奶奶街
一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...
- java算法 蓝桥杯 高精度加法
问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...
随机推荐
- 阿里面试居然跟我扯了半小时的CyclicBarrier
一个大腹便便,穿着格子衬衫的中年男子,拿着一个贴满Logo的Mac向我走来,看着稀少的头发,我心想着肯定是顶级技术大牛吧!但是我也是一个才华横溢的人,稳住我们能赢. 面试官:您好,先做一下自我介绍吧! ...
- 【Poj-3693】Maximum repetition substring 后缀数组 连续重复子串
POJ - 3693 题意 SPOJ - REPEATS的进阶版,在这题的基础上输出字典序最小的重复字串. 思路 跟上题一样,先求出最长的重复次数,在求的过程中顺便纪录最多次数可能的长度. 因为sa数 ...
- Mysql 常用函数(20)- ceiling 函数
Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html ceiling 的作用 向上取整,ceil 函数一 ...
- scikit-learn 梯度提升树(GBDT)调参笔记
在梯度提升树(GBDT)原理小结中,我们对GBDT的原理做了总结,本文我们就从scikit-learn里GBDT的类库使用方法作一个总结,主要会关注调参中的一些要点. 1. scikit-learn ...
- PAT 1028 List Sorting (25分) 用char[],不要用string
题目 Excel can sort records according to any column. Now you are supposed to imitate this function. In ...
- PAT-1080 Graduate Admission (结构体排序)
1080. Graduate Admission It is said that in 2013, there were about 100 graduate schools ready to pro ...
- ajax 请求PHP返回json格式的处理
php返回代码格式 public function json(){ if (request()->isAjax()){ $data = [ 'code'=>'1', 'msg'=>' ...
- 三,<ul><li>实际应用时遇到的问题
在布局中使用的比较多的就是这个,快速排列一行或多行文字,还有横排显示作为导航栏标题栏等等书写格式:<ul> <li>山东教育.....</li></ul ...
- 特效 css3 持续动作的渐变背景
html,body{ margin:; padding:; height: 100%; width: 100%; background: linear-gradient(125deg,#2c3e50, ...
- [Abp vNext 入坑分享] - 8.Redis与Refit的接入
前言 本章结束之后,这个abp vnext系列算是初步完结了,基础的组件都已经接入了.如果各位还需要其它的组件的话,可以自己按需要进行接入使用.其实这个只是一个基础的框架,可以自己根据需要进行变通的. ...