2017年第八届蓝桥杯决赛Java本科B组试题解析
第一题 平方十位数
题目描述:
由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 }
运行结果如下:
这个题有点难,答案是:(new Boolean(last_child(pa)).toString()).replace("false", "|").replace("true", " ")+space(4)+s;
我发现了规律就是每一层向里面缩进4个空格(一个tab键一般是4个空格嘛),然后父元素如果不是最后一个那么就要在后面加|,但是答案这种写法真的没想到,也算是长见识了