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<Integer>> lifemap = new HashMap<>();//记录本轮生命体
Map<Integer, HashSet<Integer>> nmap = new HashMap<>();//记录下一轮生命体
Map<Integer, HashSet<Integer>> 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<Integer> 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)) {
if(visit.containsKey(x)) //在某个点周围被先访问了,直接跳过
if(visit.get(x).contains(y))
continue;
if(visit.containsKey(x)) {//把这个点标记已访问
visit.get(x).add(y);
}else {
HashSet<Integer> nset = new HashSet<>();
nset.add(y);
visit.put(x, nset);
}
int num = 0;
//System.out.print(x + " " + y + " : ");
for(int[] d : dir) {//周围八个点,第一层
int curx = x + d[0];
int cury = y + d[1];
boolean alive = false;
if(lifemap.containsKey(curx))
if(lifemap.get(curx).contains(cury)) {
num++;
alive = true;
}
if(alive)
continue;
//System.out.print(curx + " " + cury + " : ");
if(visit.containsKey(curx)) //如果被访问过,就跳过这个点
if(visit.get(curx).contains(cury))
continue;
if(visit.containsKey(curx)) {//把这个点标记已访问
visit.get(curx).add(cury);
}else {
HashSet<Integer> nset = new HashSet<>();
nset.add(cury);
visit.put(curx, nset);
}
int cnum = 0;
for(int[] cd : dir) {//周围8个点,第二层
int cx = curx + cd[0];
int cy = cury + cd[1];
if(lifemap.containsKey(cx))
if(lifemap.get(cx).contains(cy)) {
cnum++;
}
}
//System.out.print(cnum);
//System.out.println();
if(cnum == 3) {
if(nmap.containsKey(curx)) {//把这个点加到map里
nmap.get(curx).add(cury);
}else {
HashSet<Integer> nset = new HashSet<>();
nset.add(cury);
nmap.put(curx, nset);
}
}
}
//System.out.print(num);
//System.out.println();
if(num < 2) {
;
}else if(num >=2 && num <= 3) {
if(nmap.containsKey(x)) {
nmap.get(x).add(y);
}else {
HashSet<Integer> nset = new HashSet<>();
nset.add(y);
nmap.put(x, nset);
}
}else{
;
}
}
}
lifemap = new HashMap<>();
lifemap.putAll(nmap);
nmap.clear();
visit.clear();
cnt++;
int ans = 0;
for(Integer x : lifemap.keySet()) {
for(Integer y : lifemap.get(x)) {
//System.out.println(x + " " + y);
ans++;
}
}
System.out.println(ans);
}
}
}
将输出结果复制到excel表格中处理一下,然后找一下规律,发现每30组是一个周期,增量是5,1e9/30=33333333····10,答案就是36+33333333*5+12=166666713
|
|
|
|
参考博客:https://blog.csdn.net/TQCAI666/article/details/80325524 博主:数学工具构造器