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

题意

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

解题思路
【蓝桥杯|第七届蓝桥杯国赛 机器人塔】搜了好久都没有搜到官方题解,貌似数据大了都会超。
对于机器人塔,只要最下面一行确定了,其余的都确定了,所以暴力枚举最后一行的情况,然后统计每种情况下的A,B字符数目,判断是否满足条件。
感觉可以剪枝,想不出来………….
代码实现
#include #include #include using namespace std; #define maxn 50 int 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; }

    推荐阅读