第七届蓝桥杯国赛 机器人塔

来源:互联网 发布:淘宝刷单is房间推荐 编辑:程序博客网 时间:2024/06/05 16:35

题意

X星球的机器人表演拉拉队有两种服装,A和B。他们这次表演的是搭机器人塔。类似:     A    B B   A B A  A A B B B B B A BA 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资源约定:峰值内存消耗 < 256MCPU消耗  < 1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

解题思路

搜了好久都没有搜到官方题解,貌似数据大了都会超。
对于机器人塔,只要最下面一行确定了,其余的都确定了,所以暴力枚举最后一行的情况,然后统计每种情况下的A,B字符数目,判断是否满足条件。
感觉可以剪枝,想不出来………….

代码实现

#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define maxn 50int ans=0,row;int m,n;char s1[maxn],s2[maxn];void judge(){    int numa=0,numb=0;    int z=row;    strcpy(s2+1,s1+1);    while(z)    {        for(int i=1;i<=z;i++)            if(s2[i]=='A')                numa++;            else                numb++;        z--;        for(int i=1;i<=z;i++)            if(s2[i]==s2[i+1])                s2[i]='A';            else                s2[i]='B';    }    if(numa==m&&numb==n)        ans++;}void dfs(int cur){    if(cur==row+1)    {        judge();        return ;    }    s1[cur]='A';    dfs(cur+1);    s1[cur]='B';    dfs(cur+1);}int main(){    scanf("%d %d",&m,&n);    int i=1;    while((i*i+i)/2!=m+n)        i++;    row=i;    dfs(1);    printf("%d\n",ans);    return 0;}
原创粉丝点击