生活随笔
收集整理的這篇文章主要介紹了
                                
[蓝桥杯][2015年第六届真题]机器人塔(DFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            
                            
                            題目描述
 X星球的機器人表演拉拉隊有兩種服裝,A和B。
 他們這次表演的是搭機器人塔。
 
類似:
 
 A
B B
 
A B A
 A A B B
 B B B A B
 A B A B B A
 
隊內的組塔規則是:
 
A 只能站在 AA 或 BB 的肩上。
 B 只能站在 AB 或 BA 的肩上。
 
你的任務是幫助拉拉隊計算一下,在給定A與B的人數時,可以組成多少種花樣的塔。
 
輸入一行兩個整數 M 和 N,空格分開(0<M,N<500),分別表示A、B的人數,保證人數合理性。
 
要求輸出一個整數,表示可以產生的花樣種數。
 輸入
 輸入一行兩個整數 M 和 N,空格分開(0<M,N<500),分別表示A、B的人數,保證人數合理性。
 輸出
 要求輸出一個整數,表示可以產生的花樣種數。
 樣例輸入
 1 2
 樣例輸出
 3
 思路:我們從頂開始往下分析,對于這一行的字符串排列順序,如果開頭確定了,那么后面的隨之也就確定了,因此分類討論就可以了。
 代碼如下:
 
#include<bits/stdc++.h>
#define ll long long
using namespace std
;int n
,m
;inline ll 
dfs(int a
,int b
,int len
,string s
)
{if(a
==0&&b
==0) return 1ll;if(len
==0) return dfs(a
-1,b
,1,"A")+dfs(a
,b
-1,1,"B");else{string t
="";int c
=a
,d
=b
;ll sum
=0;if(s
[0]=='A') {if(c
>=2){t
+="AA";c
-=2;for(int i
=1;i
<s
.length();i
++) {if(s
[i
]=='A'&&t
[i
-1]=='A'&&c
) t
+='A',c
--;else if(s
[i
]=='A'&&t
[i
-1]=='B'&&d
) t
+='B',d
--;else if(s
[i
]=='B'&&t
[i
-1]=='A'&&d
) t
+='B',d
--;else if(s
[i
]=='B'&&t
[i
-1]=='B'&&c
) t
+='A',c
--;}if(t
.length()==len
+1) sum
+=dfs(c
,d
,len
+1,t
);c
=a
,d
=b
,t
="";}if(d
>=2){t
+="BB";d
-=2;for(int i
=1;i
<s
.length();i
++) {if(s
[i
]=='A'&&t
[i
-1]=='A'&&c
) t
+='A',c
--;else if(s
[i
]=='A'&&t
[i
-1]=='B'&&d
) t
+='B',d
--;else if(s
[i
]=='B'&&t
[i
-1]=='A'&&d
) t
+='B',d
--;else if(s
[i
]=='B'&&t
[i
-1]=='B'&&c
) t
+='A',c
--;}if(t
.length()==len
+1) sum
+=dfs(c
,d
,len
+1,t
);c
=a
,d
=b
,t
="";}}c
=a
,d
=b
,t
="";if(s
[0]=='B'){if(c
&&d
){t
+="AB";c
--,d
--;for(int i
=1;i
<s
.length();i
++) {if(s
[i
]=='A'&&t
[i
-1]=='A'&&c
) t
+='A',c
--;else if(s
[i
]=='A'&&t
[i
-1]=='B'&&d
) t
+='B',d
--;else if(s
[i
]=='B'&&t
[i
-1]=='A'&&d
) t
+='B',d
--;else if(s
[i
]=='B'&&t
[i
-1]=='B'&&c
) t
+='A',c
--;}if(t
.length()==len
+1) sum
+=dfs(c
,d
,len
+1,t
);c
=a
,d
=b
,t
="";t
+="BA";c
--,d
--;for(int i
=1;i
<s
.length();i
++) {if(s
[i
]=='A'&&t
[i
-1]=='A'&&c
) t
+='A',c
--;else if(s
[i
]=='A'&&t
[i
-1]=='B'&&d
) t
+='B',d
--;else if(s
[i
]=='B'&&t
[i
-1]=='A'&&d
) t
+='B',d
--;else if(s
[i
]=='B'&&t
[i
-1]=='B'&&c
) t
+='A',c
--;}if(t
.length()==len
+1) sum
+=dfs(c
,d
,len
+1,t
);c
=a
,d
=b
,t
="";}}return sum
;}
}
int main()
{while(~scanf("%d%d",&n
,&m
)){printf("%lld\n",dfs(n
,m
,0,""));}return 0;
}
 
努力加油a啊,(o)/~
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
                            
總結
                            
                                以上是生活随笔為你收集整理的[蓝桥杯][2015年第六届真题]机器人塔(DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。