蓝桥杯2017国赛JAVAB组 生命游戏 题解

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  博主:数学工具构造器
 

猜你喜欢

转载自www.cnblogs.com/littleblue/p/10882630.html
今日推荐