日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蓝桥杯第七届国赛JAVA真题----机器人塔

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯第七届国赛JAVA真题----机器人塔 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
機器人塔

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真题----机器人塔的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。