2017年第八届蓝桥杯决赛Java本科B组试题解析

时间:2021-11-21 11:12:33

 

 

第一题  平方十位数

题目描述:

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

比如:1026753849,就是其中最小的一个平方数。请你找出其中最大的一个平方数是多少?

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

 1 public class t1 {
 2     public static long max;
 3 
 4     public static void check(long n) {
 5         long t = n;
 6         Set<Integer> set = new HashSet<>();
 7         while (t != 0) {
 8             int i = (int)(t % 10);
 9             set.add(i);
10             t = t / 10;
11         }
12         
13         if(set.size()==10 && max < n) {
14             max = n;
15         }
16     }
17 
18     public static void main(String[] args) {
19 
20         // System.out.println(Math.sqrt(1026753849)); // 32043.0
21 
22         for (long i = 32043; i <= 99380; i++) {
23             long s = i * i;
24             check(s);
25 
26         }
27         
28         System.out.println(max);
29         // answer: 9814072356
30 
31     }
32 
33 }

 

 

第二题  生命游戏

康威生命游戏是英国数学家约翰·何顿·康威在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网格上推演,并非只有题目中画出的那点空间。
当然,对于遥远的位置,其初始状态一概为死细胞。

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

 

 

 

第三题  树形显示

对于分类结构可以用树形来形象地表示。比如:文件系统就是典型的例子。

树中的结点具有父子关系。我们在显示的时候,把子项向右缩进(用空格,不是tab),并添加必要的连接线,以使其层次关系更醒目。

下面的代码就是为了这个目的的,请仔细阅读源码,并填写划线部分缺少的代码。

 1 import java.util.*;
 2  
 3 class MyTree
 4 {
 5     private Map<String, List<String>>  map_ch = new HashMap<String, List<String>>();
 6     private Map<String,String> map_pa = new HashMap<String,String>();
 7     
 8     public void add(String parent, String child)
 9     {
10         map_pa.put(child, parent);
11         
12         List<String> lst = map_ch.get(parent);
13         if(lst==null){
14             lst = new ArrayList<String>();
15             map_ch.put(parent, lst);
16         }
17         lst.add(child);
18     }
19     
20     public String get_parent(String me){
21         return map_pa.get(me);
22     }
23     
24     public List<String> get_child(String me){
25         return map_ch.get(me);
26     }
27     
28     private String space(int n)
29     {
30         String s = "";
31         for(int i=0; i<n; i++) s += ' ';
32         return s;
33     }
34     
35     private boolean last_child(String x){
36         String pa = map_pa.get(x);
37         if(pa==null) return true;
38         
39         List<String> lst = map_ch.get(pa);
40         return lst.get(lst.size()-1).equals(x);
41     }
42     
43     public void show(String x){
44         
45         String s = "+--" + x;
46         
47         String pa = x;
48         while(true){
49             pa = map_pa.get(pa);
50             if(pa==null) break;
51             s = ___________________________________ ;  // 填空
52         }
53         
54         System.out.println(s);
55     }
56     
57     public void dfs(String x){
58         show(x);
59         
60         List<String> lst = map_ch.get(x);
61         if(lst==null) return;
62                 
63         for(String it: lst){
64             dfs(it);
65         }
66     }
67 }
68  
69 public class TreeView
70 {
71     public static void main(String[] args)
72     {
73         MyTree tree = new MyTree();
74         tree.add("root", "dog");
75         tree.add("root", "cat");
76         tree.add("root", "duck");
77         tree.add("dog", "AAdog");
78         tree.add("dog", "BBdog");
79         tree.add("dog", "CCdog");
80         tree.add("AAdog", "AAdog01");
81         tree.add("AAdog", "AAdog02");
82         tree.add("cat", "XXcat");
83         tree.add("cat", "YYcat");
84         tree.add("XXcat","XXcat-oo");
85         tree.add("XXcat","XXcat-qq");
86         tree.add("XXcat-qq", "XXcat-qq-hahah");
87         tree.add("duck", "TTduck");
88         tree.add("TTduck", "TTduck-001");
89         tree.add("TTduck", "TTduck-002");
90         tree.add("TTduck", "TTduck-003");
91         tree.add("YYcat","YYcat.hello");
92         tree.add("YYcat","YYcat.yes");
93         tree.add("YYcat","YYcat.me");        
94         
95         tree.dfs("root");
96     }
97 }

运行结果如下:

2017年第八届蓝桥杯决赛Java本科B组试题解析

这个题有点难,答案是:(new Boolean(last_child(pa)).toString()).replace("false", "|").replace("true", " ")+space(4)+s; 

我发现了规律就是每一层向里面缩进4个空格(一个tab键一般是4个空格嘛),然后父元素如果不是最后一个那么就要在后面加|,但是答案这种写法真的没想到,也算是长见识了