x星球的機械人表演拉拉隊有兩種服裝,a和b。 他們這次表演的是搭機械人塔。
類似:
你的任務是幫助拉拉隊計算一下,在給定a與b的人數時,可以組成多少種花樣的塔。a
b ba b a
aa b b
b b b a b
a b a b b a
輸入一行兩個整數 m 和 n,空格分開(0<m,n<500),分別表示a、b的人數,保證人數合理性。
要求輸出乙個整數,表示可以產生的花樣種數。
例如: 使用者輸入: 1 2
程式應該輸出: 3
再例如:; 使用者輸入: 3 3
程式應該輸出: 4
資源約定: 峰值記憶體消耗 < 256m cpu消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入…」 的多餘內容。
所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。
注意: main函式需要返回0 注意: 只使用ansi c/ansi c++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。 注意:
所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。
提交時,注意選擇所期望的編譯器型別。
網上關於這道題這種的題解不多,然後因為藍橋練習系統裡沒找到這道題所以以下**未ac,算是記錄一下思路
然後這個題感覺有點理解性的歧義,是在盡可能最大的三角堆的前提下還是說小堆小堆的組合也算?
不是很清楚,不過的**是在最大的三角堆下形成的排列
這種塔型很容易就想到滿二叉樹,而完全二叉樹有乙個很好的特性就是,父節點是i,則左兒子是2i,右兒子是(2i+1)
可以通過這個來檢驗合法性或者填元素
塔作為乙個三角堆,同時也可以向下分成多個三角堆,以下**是從三角形的頭頭開始往下填元素。
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
int num=0;//記錄方案數
char list[1005];//用來儲存數字
//深度優先的試探
void dfs(char top,int anum,int bnum,int cur,int maxs,int& size){//top表示乙個小三角的頂端元素 ,anum和bnum分別為a和b的剩餘個數 ,cur表示當前座標,maxs表示最大能填的元素個數同時也算陣列的假定邊界,size表示已填的元素個數
//此處的size用的是引用,因為當程式結束下層遞迴回退回來是,size不應該回退,畢竟下面的元素已經填充了,不過這裡也可以吧size放到函式的外面,而不用作為乙個引數
if(bnum<0||anum<0||cur>maxs)return;//當a或b元素小於0或者試探的位置越界時就不再往下試探
list[cur]=top;//將元素填充到乙個位置
size++;//因此個數就加了乙個
if(size==maxs){//如果元素個數等於最大元素數表示這個時候已經填完,一種排列完成
num++;
for(int i=1;i<=maxs;i++)cout<>m>>n;
string line="";
int h =log(m+n+1)/log(2);//計算最大層數
int maxs = pow(2,h)-1;//計算此層數下的元素值
int i=0;
dfs('a',m-1,n,1,maxs,i);//頂底為a時的排列數
i=0;
dfs('b',m,n-1,1,maxs,i);//頂底為b時的排列數
cout<
除題目給出的測試用例外
比如15 1 --> 1 //像這樣(anum>15,bnum<2)的情況下,可以很明顯的看出這個時候只有一種組合就是全a,不過網上很多答案對這類輸入的結果0
除此外其他的也不好驗證了,畢竟3層之後的組合我也推不出來了......
藍橋杯 機械人塔(dfs)
題目描述 x星球的機械人表演拉拉隊有兩種服裝,a和b。他們這次表演的是搭機械人塔。類似 a b ba b a a a b b b b b a b a b a b b a 隊內的組塔規則是 a 只能站在 aa 或 bb 的肩上。b 只能站在 ab 或 ba 的肩上。你的任務是幫助拉拉隊計算一下,在給定...
機械人塔 藍橋
題目描述 x星球的機械人表演拉拉隊有兩種服裝,a和b。他們這次表演的是搭機械人塔。類似 a b ba b a a a b b b b b a b a b a b b a 隊內的組塔規則是 a 只能站在 aa 或 bb 的肩上。b 只能站在 ab 或 ba 的肩上。你的任務是幫助拉拉隊計算一下,在給定...
機械人塔(藍橋)
特別好的題解 機械人塔 x星球的機械人表演拉拉隊有兩種服裝,a和b。他們這次表演的是搭機械人塔。類似 a b ba b a a a b b b b b a b a b a b b a 隊內的組塔規則是 a 只能站在 aa 或 bb 的肩上。b 只能站在 ab 或 ba 的肩上。你的任務是幫助拉拉隊計...