生活随笔
收集整理的這篇文章主要介紹了
[蓝桥杯][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)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。