[蓝桥杯][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;
}
原文地址:https://www.cnblogs.com/Staceyacm/p/10781741.html