蓝桥杯第七届国赛JAVA真题----机器人塔
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯第七届国赛JAVA真题----机器人塔
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
機器人塔
X星球的機器人表演拉拉隊有兩種服裝,A和B。
他們這次表演的是搭機器人塔。
類似:
????B 只能站在 AB 或 BA 的肩上。
你的任務是幫助拉拉隊計算一下,在給定A與B的人數時,可以組成多少種花樣的塔。
輸入一行兩個整數 M 和 N,空格分開(0<M,N<500),分別表示A、B的人數,保證人數合理性。
要求輸出一個整數,表示可以產生的花樣種數。
例如:
用戶輸入:
1 2
程序應該輸出:
3
再例如:
用戶輸入:
3 3
程序應該輸出:
4
資源約定:
峰值內存消耗 < 256M
CPU消耗? < 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
X星球的機器人表演拉拉隊有兩種服裝,A和B。
他們這次表演的是搭機器人塔。
類似:
隊內的組塔規則是:
????A 只能站在 AA 或 BB 的肩上。????B 只能站在 AB 或 BA 的肩上。
你的任務是幫助拉拉隊計算一下,在給定A與B的人數時,可以組成多少種花樣的塔。
輸入一行兩個整數 M 和 N,空格分開(0<M,N<500),分別表示A、B的人數,保證人數合理性。
要求輸出一個整數,表示可以產生的花樣種數。
例如:
用戶輸入:
1 2
程序應該輸出:
3
再例如:
用戶輸入:
3 3
程序應該輸出:
4
資源約定:
峰值內存消耗 < 256M
CPU消耗? < 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
解析:由題目分析我們可以知道,只要確定了最后一排的順序就可以確定一個機器人塔,我們根據這個思路,只要對最后一排進行深搜,將符合條件的情況記錄即可。那么這樣一個思路我們需要解決的首要問題就是最后一排有幾個數,我們要對幾個“機器人”進行全排列。因為m+n最多1000個人,所以機器人塔最多會有50層,這里稍微估計一下就能猜出。
// 求出按三角形排列從第1層到第i層有a[i]個元素,非常巧妙的思路 for (int i = 0; i <= 50; i++) {sum += i;a[i] = sum; } // 求出在n個A和m個B的情況下,最多能擺到第幾層。 for (int i = 0; i <= 50; i++) {if (a[i] == m+n) {maxRow = i;break;} }只能說有些代碼巧妙地難以理解
import java.util.Scanner;public class Main {static int[] a = new int[1005];static char[] s = new char[1005];static int sum = 0;static int m, n;static int maxRow;static int cnt = 0;static int[] vis = new int[1005];public static void main(String[] args) {Scanner in = new Scanner(System.in);m = in.nextInt();n = in.nextInt();// 求出按三角形排列從第1層到第i層有a[i]個元素,巧妙至極 for (int i = 0; i <= 50; i++) {sum += i;a[i] = sum;}// 求出在n個A和m個B的情況下,最多能擺到第幾層。 for (int i = 0; i <= 50; i++) {if (a[i] == m+n) {maxRow = i;break;}}dfs(1);System.out.println(cnt);}private static void dfs(int n) {// TODO Auto-generated method stubif (n == maxRow + 1) {if (check(maxRow)) {cnt++;}return;}if (vis[n] == 0) {vis[n] = 1;s[n] = 'A';dfs(n + 1);s[n] = 'B';dfs(n + 1);vis[n] = 0;}}private static boolean check(int t) {char[] temp = new char[1005];// 將字符串temp從第1位到第s.length()-1位給從temp的第1位開始賦值 System.arraycopy(s, 1, temp, 1, s.length-1);int sum_a = 0, sum_b = 0;while (t != 0) {for (int i = 1; i <= t; i++) {if (temp[i] == 'A') {sum_a++;}if (temp[i] == 'B') {sum_b++;}}// t--代表上移一排,但是采用的是對數組更新,縮短 for (int i = 1; i <= t-1; i++) {if (temp[i] == temp[i + 1]) {temp[i] = 'A';} else {temp[i] = 'B';}}t--;}if (sum_a == m && sum_b == n) {return true;}return false;} }總結
以上是生活随笔為你收集整理的蓝桥杯第七届国赛JAVA真题----机器人塔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Debian的软件包管理工具命令不完全列
- 下一篇: 蓝桥杯历届试题----矩阵翻硬币