[蓝桥杯][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<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>

const int maxn=1e5+5;
typedef long long ll;
using namespace std;
int a[50][50];
int k=1;
int vis[55];
int s=0;
int n,m;
void dfs(int x)
{
   if(x==k)
   {
   	for(int j=k-2;j>=0;j--)
   	{
   		for(int kk=0;kk<=j;kk++)
   		if((a[j+1][kk]==0&&a[j+1][kk+1]==1)||(a[j+1][kk]==1&&a[j+1][kk+1]==0))
   		{
   			
   			a[j][kk]=1;
   		}
   		else
   		{
   			
   			a[j][kk]=0;
   		}
   	}
   	int s1=0;
   	int s2=0;
   	for(int t=0;t<k;t++)
   	{
   		for(int j=0;j<=t;j++)
   		{
   		   if(a[t][j]==0)
   		   {
   		   	s1++;
		   }
		   else
		   {
		   	s2++;
		   }
   		}
   		
   	}
   	if(s1==n&&s2==m)
   	{
	   s++;
	}
   	return ;
   }
   if(vis[x]==0)
   {
   	vis[x]=1;
    a[k-1][x]=1;
   	dfs(x+1);
   	a[k-1][x]=0;
   	dfs(x+1);
   	vis[x]=0;
   }
   
}
int main()
{
	cin>>n>>m;
	int sum=0;
	while(sum+k<n+m)
	{
		sum+=k;
		k++;
	}
	dfs(0);
    cout<<s<<endl;
	return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

black-hole6

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值