机器人塔
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的人数,保证人数合理性。
要求输出一个整数,表示可以产生的花样种数。
例如:
用户输入:
1 2
程序应该输出:
3
再例如:
用户输入:
3 3
程序应该输出:
4
思路:
确定最后一行就可以了,最后一行的排列决定了整个塔的排列,然后对塔进行检查,看是否符合要求。
#include <iostream>
using namespace std;
int m,n;
int map[45][45];
long long ans=0;
int d_bit() //求最后一行的个数
{
int i=1;
int sum=0;
while(sum<m+n)
{
sum+=i++;
}
return i-1;
}
bool cheak(int a,int b) //检查是否满足条件
{
for(int i=d_bit()-2;i>=0;i--)
{
for(int j=0;j<=i;j++)
{
if(map[i+1][j]==map[i+1][j+1])//脚下相同
{
map[i][j]=0; //选a
a--;
}
else
{
map[i][j]=1; //选b
b--;
}
}
}
return b==0&&a==0;
}
void dfs(int index,int size,int a,int b, char flag)
{
if(index==size)
{
if(flag=='a')
{
if(cheak(a+1,b))
ans++;
}
else
{
if(cheak(a,b+1))
ans++;
}
return;
}
if(flag=='a')
map[size-1][index]=0;//取a
else
map[size-1][index]=1; //取b
if(a>0) dfs(index+1,size,a-1,b,'a');
if(b>0) dfs(index+1,size,a,b-1,'b');
}
int main()
{
cin>>m>>n;
dfs(0,d_bit(),m-1,n,'a');
dfs(0,d_bit(),m,n-1,'b');
cout<<ans;
return 0;
}