题目描述
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
思路
只要确定最后一行排列样式,整体就确定了。
dfs遍历所有样式,再在最后一行的基础上根据 【A 只能站在 AA 或 BB 的肩上,
B 只能站在 AB 或 BA 的肩上】验证上面A和B的数量是否满足给出的数据即可
#include<iostream>
#include<cstring>
using namespace std;
int a,b,ans,n;
int ch[55][55];
bool check(int aa,int bb)
{
int ta=aa,tb=bb;
int t=n;
while(t>1)//计算前n-1层
{
for(int i=0;i<t-1;i++)
{
ch[t-2][i]=ch[t-1][i]==ch[t-1][i+1];
if(ch[t-2][i]==1)
{
if(ta)
ta--;
else//此处应该放A A如果没了就不行
return false;
}
else
{
if(tb)
tb--;
else
return false;
}
}
t--;
}
return true;
}
void dfs(int aa,int bb,int loc)
{
if(loc==n)//最后一行已经排完
{
if(check(aa,bb))//验证
ans++;
return;
}
if(aa)//如果还有A
{
ch[n-1][loc]=1;//我把A设成1 B设成0
dfs(aa-1,bb,loc+1);
}
if(bb)//如果还有B
{
ch[n-1][loc]=0;
dfs(aa,bb-1,loc+1);
}
}
int main()
{
cin >> a >> b;
int i=1;
n=1;//n是最后一排的人数
while(1)//计算最后一排的人数
{
if(i==a+b)
break;
n++;
i+=n;
}
dfs(a,b,0); //当前a个A,b个B,最后一行的第0列还没有确定的状态(列从0~n-1)
cout << ans;
}