• 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个空格嘛),然后父元素如果不是最后一个那么就要在后面加|,但是答案这种写法真的没想到,也算是长见识了

  • 相关阅读:
    posix多线程有感POSIX 线程间的内存可视性
    同步和互斥的一些问题(死锁,优先级逆转)
    POSIX线程属性
    POSIX 条件变量详细解析
    VMware网络配置详解
    POSIX线程
    Java+Selenium——Actions鼠标悬停
    Java+Selenium——截图方法TakeScreenshot——保存到桌面——TakeScreenshot截图只针对浏览器的web事件
    Java+Selenium——利用Robot类截图——整个桌面截图
    Java+Selenium——如何处理日历控件——方法二
  • 原文地址:https://www.cnblogs.com/wyb666/p/10897219.html
Copyright © 2020-2023  润新知