第八届蓝桥杯JavaB组国(决)赛真题

解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论

题目1、平方十位数

题目描述
由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。
这其中也有很多恰好是平方数(是某个数的平方)。

比如:1026753849,就是其中最小的一个平方数。

请你找出其中最大的一个平方数是多少?

注意:你需要提交的是一个10位数字,不要填写任何多余内容。

public class Main {
 
	public static void main(String[] args) {
		for (long i = 100000; i > 32000; i--) {
			long sqrt = i * i;
			String s = String.valueOf(sqrt);
			boolean b = true;
			for (int j = 0; j < 10; j++) {
				if (s.indexOf("" + j) == -1) {
					b = false;
					break;
				}
			}
			if (b) {
				System.out.println(i * i);
				break;
			}
		}
	}
 
}
题目2、生命游戏
题目描述
康威生命游戏是英国数学家约翰·何顿·康威在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网格上推演,并非只有题目中画出的那点空间。
当然,对于遥远的位置,其初始状态一概为死细胞。

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

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)) {

                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 
  • 18
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 25
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值