机器人塔-蓝桥

题目描述
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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值