算法笔记_202:第三届蓝桥杯软件类决赛真题(Java高职)
生活随笔
收集整理的這篇文章主要介紹了
算法笔记_202:第三届蓝桥杯软件类决赛真题(Java高职)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
1 填算式
2 提取子串
3 機器人行走
4 地址格式轉換
5 排日程
?
前言:以下代碼僅供參考,若有錯誤歡迎指正哦~
1 填算式
?
【結果填空】 (滿分11分)看這個算式:☆☆☆ + ☆☆☆ = ☆☆☆如果每個五角星代表 1 ~ 9 的不同的數字。這個算式有多少種可能的正確填寫方法?173 + 286 = 459295 + 173 = 468173 + 295 = 468183 + 492 = 675以上都是正確的填寫法!注意:111 + 222 = 333 是錯誤的填寫法!因為每個數字必須是不同的! 也就是說:1~9中的所有數字,每個必須出現且僅出現一次!注意:不包括數字“0”!注意:滿足加法交換率的式子算兩種不同的答案。所以答案肯定是個偶數!注意:只要求計算不同的填法的數目不要求列出所有填寫法更不要求填寫源代碼!答案不要寫在這里,請寫在“解答.txt”中!336?
1 public class Main { 2 public static int count = 0; 3 4 public static void swap(int[] A, int i, int j) { 5 int temp = A[i]; 6 A[i] = A[j]; 7 A[j] = temp; 8 } 9 10 public static void dfs(int[] A, int step) { 11 if(step == A.length) { 12 int a = A[0]*100 + A[1]*10 + A[2]; 13 int b = A[3]*100 + A[4]*10 + A[5]; 14 int c = A[6]*100 + A[7]*10 + A[8]; 15 if(a + b == c) 16 count++; 17 return; 18 } else { 19 for(int i = step;i < A.length;i++) { 20 swap(A, i, step); 21 dfs(A, step + 1); 22 swap(A, i, step); 23 } 24 } 25 } 26 27 public static void main(String[] args) { 28 int[] A = {1,2,3,4,5,6,7,8,9}; 29 dfs(A, 0); 30 System.out.println(count); 31 } 32 }?
?
?
2 提取子串
?
【代碼填空】(滿分16分)串“abcba”以字母“c”為中心左右對稱;串“abba” 是另一種模式的左右對稱。這兩種情況我們都稱這個串是鏡像串。特別地,只含有1個字母的串,可以看成是第一種模式的鏡像串。 一個串可以含有許多鏡像子串。我們的目標是求一個串的最大鏡像子串(最長的鏡像子串),如果有多個最大鏡像子串,對稱中心靠左的優先選中。例如:“abcdeefghhgfeiieje444k444lmn”的最大鏡像子串是:“efghhgfe”下面的靜態方法實現了該功能,請仔細閱讀并分析代碼,填寫空白處的代碼,使得程序的邏輯合理,結果正確。// 求最大(長度最大)鏡像對稱子串 public static String getMaxMirrorString(String s) {String max_s = ""; // 所求的最大對稱子串for(int i=0; i<s.length(); i++){// 第一種對稱模式int step = 1;try{for(;;){if(s.charAt(i-step) != s.charAt(i+step)) break;step++;}}catch(Exception e){}String s1 = s.substring(_____________________________); // 填空1// 第二種對稱模式step = 0;try{for(;;){if(_________________________________) break; // 填空2step++;}}catch(Exception e){}String s2 = s.substring(i-step+1,i+step+1);if(s1.length() > max_s.length()) max_s = s1;if(s2.length() > max_s.length()) max_s = s2;}return max_s; }【注意】只填寫缺少的部分,不要抄寫已有的代碼。所填寫代碼不超過1條語句(句中不會含有分號)所填代碼長度不超過256個字符。答案寫在“解答.txt”中,不要寫在這里!i-step+1, i+step s.charAt(i-step) != s.charAt(i+step+1)?
?
?
?
3 機器人行走
?
【編程題】(滿分18分)某少年宮引進了一批機器人小車??梢越邮茴A先輸入的指令,按指令行動。小車的基本動作很簡單,只有3種:左轉(記為L),右轉(記為R),向前走若干厘米(直接記數字)。例如,我們可以對小車輸入如下的指令:15L10R5LRR10R20則,小車先直行15厘米,左轉,再走10厘米,再右轉,...不難看出,對于此指令串,小車又回到了出發地。你的任務是:編寫程序,由用戶輸入指令,程序輸出每條指令執行后小車位置與指令執行前小車位置的直線距離?!据斎?、輸出格式要求】用戶先輸入一個整數n(n<100),表示接下來將有n條指令。接下來輸入n條指令。每條指令只由L、R和數字組成(數字是0~100之間的整數)每條指令的長度不超過256個字符。程序則輸出n行結果。每條結果表示小車執行相應的指令前后位置的直線距離。要求四舍五入到小數后2位。例如:用戶輸入: 5 L100R50R10 3LLL5RR4L12 LL 100R 5L5L5L5則程序輸出: 102.96 9.06 0.00 100.00 0.00【注意】請仔細調試!您的程序只有能運行出正確結果的時候才有機會得分!請把所有類寫在同一個文件中,調試好后,存入與【考生文件夾】下對應題號的“解答.txt”中即可。相關的工程文件不要拷入。請不要使用package語句。源程序中只能出現JDK1.5中允許的語法或調用。不能使用1.6或更高版本。 1 import java.util.Scanner; 2 3 4 public class Main { 5 public static String Left = "ULDR"; 6 public static String Right = "URDL"; 7 8 public double getResult(String A) { 9 double r = 0, x = 0, y = 0; 10 char way = 'U'; 11 for(int i = 0;i < A.length();i++) { 12 int start = i; 13 if(A.charAt(start) >= '0' && A.charAt(start) <= '9') { 14 while(start < A.length() && A.charAt(start) >= '0' && A.charAt(start) <= '9') 15 start++; 16 int num = Integer.valueOf(A.substring(i, start)); 17 if(way == 'U') 18 y += num; 19 else if(way == 'L') 20 x -= num; 21 else if(way == 'D') 22 y -= num; 23 else if(way == 'R') 24 x += num; 25 i = start - 1; 26 } else { 27 char temp = A.charAt(i); 28 if(temp == 'L') { 29 int p = Left.indexOf(way+""); 30 p = (p + 1) % 4; 31 way = Left.charAt(p); 32 } else if(temp == 'R') { 33 int p = Right.indexOf(way+""); 34 p = (p + 1) % 4; 35 way = Right.charAt(p); 36 } 37 } 38 } 39 r = Math.sqrt(x*x + y*y); 40 return r; 41 } 42 43 public static void main(String[] args) { 44 Main test = new Main(); 45 Scanner in = new Scanner(System.in); 46 int n = in.nextInt(); 47 double[] result = new double[n]; 48 for(int i = 0;i < n;i++) { 49 String A = in.next(); 50 result[i] = test.getResult(A); 51 } 52 for(int i = 0;i < n;i++) { 53 System.out.printf("%.2f", result[i]); 54 System.out.println(); 55 } 56 } 57 }?
?
?
?
4 地址格式轉換
?
【編程題】(滿分21分)Excel是最常用的辦公軟件。每個單元格都有唯一的地址表示。比如:第12行第4列表示為:“D12”,第5行第255列表示為“IU5”。事實上,Excel提供了兩種地址表示方法,還有一種表示法叫做RC格式地址。 第12行第4列表示為:“R12C4”,第5行第255列表示為“R5C255”。你的任務是:編寫程序,實現從RC地址格式到常規地址格式的轉換?!据斎搿⑤敵龈袷揭蟆坑脩粝容斎胍粋€整數n(n<100),表示接下來有n行輸入數據。接著輸入的n行數據是RC格式的Excel單元格地址表示法。程序則輸出n行數據,每行是轉換后的常規地址表示法。例如:用戶輸入: 2 R12C4 R5C255則程序應該輸出: D12 IU5【注意】請仔細調試!您的程序只有能運行出正確結果的時候才有機會得分!請把所有類寫在同一個文件中,調試好后,存入與【考生文件夾】下對應題號的“解答.txt”中即可。相關的工程文件不要拷入。請不要使用package語句。源程序中只能出現JDK1.5中允許的語法或調用。不能使用1.6或更高版本。 1 import java.util.ArrayList; 2 import java.util.Scanner; 3 4 5 public class Main { 6 public static String Position = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 7 8 public String getResult(String A) { 9 String r = ""; 10 ArrayList<Integer> list = new ArrayList<Integer>(); 11 int a = 0, b = 0; 12 int m = A.indexOf('C'); 13 a = Integer.valueOf(A.substring(1, m)); 14 b = Integer.valueOf(A.substring(m + 1)); 15 while(b > 0) { 16 list.add(b % 26); 17 b = b / 26; 18 } 19 for(int i = list.size() - 1;i >= 0;i--) 20 r = r + Position.charAt(list.get(i)); 21 r = r + a; 22 return r; 23 } 24 25 public static void main(String[] args) throws Exception { 26 Main test = new Main(); 27 Scanner in = new Scanner(System.in); 28 int n = in.nextInt(); 29 String[] result = new String[n]; 30 for(int i = 0;i < n;i++) { 31 String A = in.next(); 32 result[i] = test.getResult(A); 33 } 34 for(int i = 0;i < n;i++) 35 System.out.println(result[i]); 36 } 37 }?
?
?
?
5 排日程
?
【編程題】(滿分34分)某保密單位機要人員 A,B,C,D,E 每周需要工作5天,休息2天。上級要求每個人每周的工作日和休息日安排必須是固定的,不能在周間變更。此外,由于工作需要,還有如下要求:1. 所有人的連續工作日不能多于3天(注意:周日連到下周一也是連續)。2. 一周中,至少有3天所有人都是上班的。3. 任何一天,必須保證 A B C D 中至少有2人上班。4. B D E 在周日那天必須休息。5. A E 周三必須上班。6. A C 一周中必須至少有4天能見面(即同時上班)。你的任務是:編寫程序,列出ABCDE所有可能的一周排班情況。工作日記為1,休息日記為0A B C D E 每人占用1行記錄,從星期一開始?!据斎搿⑤敵龈袷揭蟆砍绦驔]有輸入,要求輸出所有可能的方案。每個方案是7x5的矩陣。只有1和0組成。 矩陣中的列表示星期幾,從星期一開始。矩陣的行分別表示A,B,C,D,E的作息時間表。多個矩陣間用空行分隔開。例如,如下的矩陣就是一個合格的解。請編程輸出所有解(多個解的前后順序不重要)。0110111 1101110 0110111 1101110 1110110【注意】請仔細調試!您的程序只有能運行出正確結果的時候才有機會得分!請把所有類寫在同一個文件中,調試好后,存入與【考生文件夾】下對應題號的“解答.txt”中即可。相關的工程文件不要拷入。請不要使用package語句。源程序中只能出現JDK1.5中允許的語法或調用。不能使用1.6或更高版本。?
1 import java.util.ArrayList; 2 3 4 public class Main { 5 public static int[] S = {0, 1}; 6 public static ArrayList<String> list = new ArrayList<String>(); 7 public static ArrayList<String> result = new ArrayList<String>(); 8 9 public boolean check(int[] A) { 10 int count = 0; 11 for(int i = 0;i < 7;i++) { 12 if(A[i] == 1) 13 count++; 14 if(A[i % 7] == 1 && A[(i+1) % 7] == 1 && A[(i+2) % 7] == 1 15 && A[(i+3) % 7] == 1) 16 return false; 17 } 18 if(count == 5) 19 return true; 20 return false; 21 } 22 23 public void dfs(int[] A, int step) { 24 if(step == A.length) { 25 if(check(A)) { 26 StringBuilder s = new StringBuilder(""); 27 for(int i = 0;i < A.length;i++) 28 s.append(A[i]); 29 if(!list.contains(s)) 30 list.add(s.toString()); 31 } 32 return; 33 } else { 34 for(int i = 0;i < 2;i++) { 35 A[step] = S[i]; 36 dfs(A, step + 1); 37 A[step] = -1; 38 } 39 } 40 } 41 42 public boolean check1(String[] arrayA, int step) { 43 if(step >= 0) { 44 if(arrayA[0].charAt(2) != '1') 45 return false; 46 } 47 if(step >= 1) { 48 if(arrayA[1].charAt(6) != '0') 49 return false; 50 } 51 if(step >= 2) { 52 int count = 0; 53 for(int i = 0;i < arrayA[0].length();i++) { 54 if(arrayA[0].charAt(i) == arrayA[2].charAt(i) && 55 arrayA[0].charAt(i) == '1') 56 count++; 57 } 58 if(count < 4) 59 return false; 60 } 61 if(step >= 3) { 62 if(arrayA[3].charAt(6) != '0') 63 return false; 64 for(int i = 0;i < arrayA[0].length();i++) { 65 int count = 0; 66 if(arrayA[0].charAt(i) == '1') 67 count++; 68 if(arrayA[1].charAt(i) == '1') 69 count++; 70 if(arrayA[2].charAt(i) == '1') 71 count++; 72 if(arrayA[3].charAt(i) == '1') 73 count++; 74 if(count < 2) 75 return false; 76 } 77 } 78 if(step >= 4) { 79 if(arrayA[4].charAt(6) != '0' || arrayA[4].charAt(2) != '1') 80 return false; 81 int count = 0; 82 for(int i = 0;i < arrayA[0].length();i++) { 83 if(arrayA[0].charAt(i) == '1' && arrayA[1].charAt(i) 84 == '1' && arrayA[2].charAt(i) == '1' && 85 arrayA[3].charAt(i) == '1' && arrayA[4].charAt(i) == '1') 86 count++; 87 } 88 if(count < 3) 89 return false; 90 } 91 return true; 92 } 93 94 public void dfsResult(String[] arrayA, int step) { 95 if(step == 5) { 96 String s = ""; 97 for(int i = 0;i < arrayA.length;i++) { 98 s = s + arrayA[i] + "\n"; 99 } 100 if(!result.contains(s)) 101 result.add(s); 102 return; 103 } else { 104 for(int i = 0;i < list.size();i++) { 105 arrayA[step] = list.get(i); 106 if(check1(arrayA, step)) { 107 dfsResult(arrayA, step + 1); 108 arrayA[step] = ""; 109 } else { 110 continue; 111 } 112 } 113 } 114 } 115 116 public void getResult() { 117 int[] A = {-1,-1,-1,-1,-1,-1,-1}; 118 dfs(A, 0); 119 String[] arrayA = new String[5]; 120 dfsResult(arrayA, 0); 121 122 for(int i = 0;i < result.size();i++) 123 System.out.println(result.get(i)); 124 } 125 126 public static void main(String[] args) { 127 Main test = new Main(); 128 test.getResult(); 129 130 } 131 }?
轉載于:https://www.cnblogs.com/liuzhen1995/p/6847038.html
總結
以上是生活随笔為你收集整理的算法笔记_202:第三届蓝桥杯软件类决赛真题(Java高职)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java缓存框架使用EhCache结合S
- 下一篇: 数字前端工程师必备技能