2017年 第08届 蓝桥杯 Java B组 决赛真题详解及小结
- ?????藍橋杯 Java B組 省賽決賽 真題詳解及小結匯總【2013年(第4屆)~2020年(第11屆)】
- 第11屆 藍橋杯-第1、2次模擬(軟件類)真題-(2020年3月、4月)-官方講解視頻
- 說明:大部分題解思路及程序代碼 源自?藍橋杯 官網視頻(Java B組歷年真題解析)?——?鄭未老師。
目? ?錄
一、平方十位數(結果填空 滿分17分)——答案:
二、生命游戲(結果填空 滿分45分)——答案:
三、樹形顯示(代碼填空 滿分23分)——答案:
四、小計算器(程序設計 滿分43分)
五、填字母游戲(程序設計 滿分71分)
六、區間移位(程序設計 滿分101分)
小結
? ??
一、平方十位數(結果填空 滿分17分)——答案:9814072356
標題:平方十位數
由0~9這10個數字不重復、不遺漏,可以組成很多10位數字。
這其中也有很多恰好是平方數(是某個數的平方)。
比如:1026753849,就是其中最小的一個平方數。
請你找出其中最大的一個平方數是多少?
注意:你需要提交的是一個10位數字,不要填寫任何多余內容。
解法一
package national_08_2017;public class A01_平方十位數 {public static long max = 0;public static void main(String[] args) { // System.out.println(Integer.MAX_VALUE);int a[] = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };f(a, 0);System.out.println(max);}public static void f(int arr[], int k) { // 全排列 列出0~9的全部組合if (k == arr.length) { // System.out.println(Arrays.toString(arr));check(arr);return;}for (int i = k; i < arr.length; i++) {int temp = arr[i];arr[i] = arr[k];arr[k] = temp;f(arr, k + 1);temp = arr[i];arr[i] = arr[k];arr[k] = temp;}}public static void check(int[] arr) { // String temp = ""; // for (int i = 0; i < arr.length; i++) { // temp += arr[i]; // } // long sum = Integer.parseInt(temp); // System.out.println(sum);for (long i = (long) Math.sqrt(sum) - 1; i <= (long) Math.sqrt(sum) + 1; i++) {if (i * i == sum) {System.out.println(sum);max = Math.max(max, sum);break;}} // int x = (int) Math.sqrt(sum); // if (x * x == sum) { // max = Math.max(max, sum); // }long t = 0;for (int i = 0; i < 10; i++) {t *= 10;t += arr[i];}long x = (long) Math.sqrt(t);if (x * x == t) {max = Math.max(max, t);}}}解法二
原文鏈接——wyk
package national_08_2017;public class A01_平方十位數2 {public static long ans = 0;public static int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };public static void tolong() {long t = 0;for (int i = 0; i < 10; i++) {t *= 10;t += arr[i];}long x = (long) Math.sqrt(t);if (x * x == t) {ans = Math.max(ans, t);}}public static void qpl(int k) {if (k >= arr.length)tolong();else {for (int i = k; i < arr.length; i++) {int t = arr[i];arr[i] = arr[k];arr[k] = t;qpl(k + 1);t = arr[i];arr[i] = arr[k];arr[k] = t;}}}public static void main(String[] args) {qpl(0);System.out.println(ans);}}二、生命游戲(結果填空 滿分45分)——答案:
標題:生命游戲
康威生命游戲是英國數學家約翰·何頓·康威在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網格上推演,并非只有題目中畫出的那點空間。
當然,對于遙遠的位置,其初始狀態一概為死細胞。
注意:需要提交的是一個整數,不要填寫多余內容。
?
?
?
?
?
?
三、樹形顯示(代碼填空 滿分23分)——答案:
標題:樹形顯示
對于分類結構可以用樹形來形象地表示。比如:文件系統就是典型的例子。
樹中的結點具有父子關系。我們在顯示的時候,把子項向右縮進(用空格,不是tab),并添加必要的連接線,以使其層次關系更醒目。
下面的代碼就是為了這個目的的,請仔細閱讀源碼,并填寫劃線部分缺少的代碼。
import java.util.*;
class MyTree
{
?? ?private Map<String, List<String>> ?map_ch = new HashMap<String, List<String>>();
?? ?private Map<String,String> map_pa = new HashMap<String,String>();
?? ?
?? ?public void add(String parent, String child)
?? ?{
?? ??? ?map_pa.put(child, parent);
?? ??? ?
?? ??? ?List<String> lst = map_ch.get(parent);
?? ??? ?if(lst==null){
?? ??? ??? ?lst = new ArrayList<String>();
?? ??? ??? ?map_ch.put(parent, lst);
?? ??? ?}
?? ??? ?lst.add(child);
?? ?}
?? ?
?? ?public String get_parent(String me){
?? ??? ?return map_pa.get(me);
?? ?}
?? ?
?? ?public List<String> get_child(String me){
?? ??? ?return map_ch.get(me);
?? ?}
?? ?
?? ?private String space(int n)
?? ?{
?? ??? ?String s = "";
?? ??? ?for(int i=0; i<n; i++) s += ' ';
?? ??? ?return s;
?? ?}
?? ?
?? ?private boolean last_child(String x){
?? ??? ?String pa = map_pa.get(x);
?? ??? ?if(pa==null) return true;
?? ??? ?
?? ??? ?List<String> lst = map_ch.get(pa);
?? ??? ?return lst.get(lst.size()-1).equals(x);
?? ?}
?? ?
?? ?public void show(String x){
?? ??? ?
?? ??? ?String s = "+--" + x;
?? ??? ?
?? ??? ?String pa = x;
?? ??? ?while(true){
?? ??? ??? ?pa = map_pa.get(pa);
?? ??? ??? ?if(pa==null) break;
?? ??? ??? ?s = ___________________________________ ; ?// 填空
?? ??? ?}
?? ??? ?
?? ??? ?System.out.println(s);
?? ?}
?? ?
?? ?public void dfs(String x){
?? ??? ?show(x);
?? ??? ?
?? ??? ?List<String> lst = map_ch.get(x);
?? ??? ?if(lst==null) return;
?? ??? ??? ??? ?
?? ??? ?for(String it: lst){
?? ??? ??? ?dfs(it);
?? ??? ?}
?? ?}
}
public class TreeView
{
?? ?public static void main(String[] args)
?? ?{
?? ??? ?MyTree tree = new MyTree();
?? ??? ?tree.add("root", "dog");
?? ??? ?tree.add("root", "cat");
?? ??? ?tree.add("root", "duck");
?? ??? ?tree.add("dog", "AAdog");
?? ??? ?tree.add("dog", "BBdog");
?? ??? ?tree.add("dog", "CCdog");
?? ??? ?tree.add("AAdog", "AAdog01");
?? ??? ?tree.add("AAdog", "AAdog02");
?? ??? ?tree.add("cat", "XXcat");
?? ??? ?tree.add("cat", "YYcat");
?? ??? ?tree.add("XXcat","XXcat-oo");
?? ??? ?tree.add("XXcat","XXcat-qq");
?? ??? ?tree.add("XXcat-qq", "XXcat-qq-hahah");
?? ??? ?tree.add("duck", "TTduck");
?? ??? ?tree.add("TTduck", "TTduck-001");
?? ??? ?tree.add("TTduck", "TTduck-002");
?? ??? ?tree.add("TTduck", "TTduck-003");
?? ??? ?tree.add("YYcat","YYcat.hello");
?? ??? ?tree.add("YYcat","YYcat.yes");
?? ??? ?tree.add("YYcat","YYcat.me");?? ??? ?
?? ??? ?
?? ??? ?tree.dfs("root");
?? ?}
}
對于題目中的測試數據,輸出結果:
+--root
? ? ?+--dog
? ? ?| ? ?+--AAdog
? ? ?| ? ?| ? ?+--AAdog01
? ? ?| ? ?| ? ?+--AAdog02
? ? ?| ? ?+--BBdog
? ? ?| ? ?+--CCdog
? ? ?+--cat
? ? ?| ? ?+--XXcat
? ? ?| ? ?| ? ?+--XXcat-oo
? ? ?| ? ?| ? ?+--XXcat-qq
? ? ?| ? ?| ? ? ? ? +--XXcat-qq-hahah
? ? ?| ? ?+--YYcat
? ? ?| ? ? ? ? +--YYcat.hello
? ? ?| ? ? ? ? +--YYcat.yes
? ? ?| ? ? ? ? +--YYcat.me
? ? ?+--duck
? ? ? ? ? +--TTduck
? ? ? ? ? ? ? ?+--TTduck-001
? ? ? ? ? ? ? ?+--TTduck-002
? ? ? ? ? ? ? ?+--TTduck-003
?? ??? ??? ? ??
如有平字體對齊問題,可以參見圖【p1.png】
注意,只填寫劃線部分缺少的代碼,不要抄寫已有的代碼或符號。
p1.png?
?
?
?
四、小計算器(程序設計 滿分43分)
標題:小計算器
模擬程序型計算器,依次輸入指令,可能包含的指令有
1. 數字:'NUM X',X為一個只包含大寫字母和數字的字符串,表示一個當前進制的數
2. 運算指令:'ADD','SUB','MUL','DIV','MOD',分別表示加減乘,除法取商,除法取余
3. 進制轉換指令:'CHANGE K',將當前進制轉換為K進制(2≤K≤36)
4. 輸出指令:'EQUAL',以當前進制輸出結果
5. 重置指令:'CLEAR',清除當前數字
指令按照以下規則給出:
數字,運算指令不會連續給出,進制轉換指令,輸出指令,重置指令有可能連續給出
運算指令后出現的第一個數字,表示參與運算的數字。且在該運算指令和該數字中間不會出現運算指令和輸出指令
重置指令后出現的第一個數字,表示基礎值。且在重置指令和第一個數字中間不會出現運算指令和輸出指令
進制轉換指令可能出現在任何地方
運算過程中中間變量均為非負整數,且小于2^63。
以大寫的'A'~'Z'表示10~35
[輸入格式]
第1行:1個n,表示指令數量
第2..n+1行:每行給出一條指令。指令序列一定以'CLEAR'作為開始,并且滿足指令規則
[輸出格式]
依次給出每一次'EQUAL'得到的結果
[樣例輸入]
7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL
[樣例輸出]
2040
補充說明:
1. n 值范圍: 1<= n < 50000
2. 初始默認的進制是十進制
資源約定:
峰值內存消耗 < 256M
CPU消耗 ?< 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
?
?
五、填字母游戲(程序設計 滿分71分)
標題:填字母游戲
小明經常玩 LOL 游戲上癮,一次他想挑戰K大師,不料K大師說:
“我們先來玩個空格填字母的游戲,要是你不能贏我,就再別玩LOL了”。
K大師在紙上畫了一行n個格子,要小明和他交替往其中填入字母。
并且:
1. 輪到某人填的時候,只能在某個空格中填入L或O
2. 誰先讓字母組成了“LOL”的字樣,誰獲勝。
3. 如果所有格子都填滿了,仍無法組成LOL,則平局。
小明試驗了幾次都輸了,他很慚愧,希望你能用計算機幫他解開這個謎。
本題的輸入格式為:
第一行,數字n(n<10),表示下面有n個初始局面。
接下來,n行,每行一個串,表示開始的局面。
? 比如:“******”, 表示有6個空格。
? “L****”, ? 表示左邊是一個字母L,它的右邊是4個空格。
要求輸出n個數字,表示對每個局面,如果小明先填,當K大師總是用最強著法的時候,小明的最好結果。
1 表示能贏
-1 表示必輸
0 表示可以逼平
例如,
輸入:
4
***
L**L
L**L***L
L*****L
則程序應該輸出:
0
-1
1
1
資源約定:
峰值內存消耗 < 256M
CPU消耗 ?< 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
?
?
?
六、區間移位(程序設計 滿分101分)
標題:區間移位
數軸上有n個閉區間:D1,...,Dn。
其中區間Di用一對整數[ai, bi]來描述,滿足ai < bi。
已知這些區間的長度之和至少有10000。
所以,通過適當的移動這些區間,你總可以使得他們的“并”覆蓋[0, 10000]——也就是說[0, 10000]這個區間內的每一個點都落于至少一個區間內。
你希望找一個移動方法,使得位移差最大的那個區間的位移量最小。
具體來說,假設你將Di移動到[ai+ci, bi+ci]這個位置。你希望使得maxi{|ci|} 最小。
【輸入格式】
輸入的第一行包含一個整數n,表示區間的數量。
接下來有n行,每行2個整數ai, bi,以一個空格分開,表示區間[ai, bi]。
保證區間的長度之和至少是10000。
【輸出格式】
輸出一個數字,表示答案。如果答案是整數,只輸出整數部分。如果答案不是整數,輸出時四舍五入保留一位小數。
【樣例輸入】
2
10 5010
4980 9980
【樣例輸出】
20
【樣例說明】
第一個區間往左移動10;第二個區間往右移動20。
【樣例輸入】
4
0 4000
3000 5000
5001 8000
7000 10000
【樣例輸出】
0.5
【樣例說明】
第2個區間往右移0.5;第3個區間往左移0.5即可。
【數據規模與約定】
對于30%的評測用例,1 <= n <= 10;
對于100%的評測用例,1 <= n <= 10000,0 <= ai < bi <= 10000。
資源約定:
峰值內存消耗 < 256M
CPU消耗 ?< 2000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
?
?
小結
好難的題!!!
總結
以上是生活随笔為你收集整理的2017年 第08届 蓝桥杯 Java B组 决赛真题详解及小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018年 第09届 蓝桥杯 Java
- 下一篇: 2016年 第07届 蓝桥杯 Java