机器人塔
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的人数,保证人数合理性。
要求输出一个整数,表示可以产生的花样种数。
例如:
用户输入:
1 2
程序应该输出:
3
再例如:
用户输入:
3 3
程序应该输出:
4
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
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的人数,保证人数合理性。
要求输出一个整数,表示可以产生的花样种数。
例如:
用户输入:
1 2
程序应该输出:
3
再例如:
用户输入:
3 3
程序应该输出:
4
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
想不到啥好办法,直接枚举第一层,然后双重for循环判断上面几层位置的数,
第一行确定了,上面的每个数都能确定
大约2^44次方。。肯定超时了,混点分还是可以的
欢迎大家加入 早起学习群,一起学习一起进步!(群号:642179511)
#include<iostream>
#include<algorithm>
#include<set>
#include<cmath>
#include<stack>
#include<string>
#include<queue>
using namespace std;
int a,b;
int len=0;
int map[1000][1000];
int cnt=0;
void f(int n,int m,int aa,int bb){
if(n>0){
int fza=aa,fzb=bb;
for(int i=1;i<len;i++){
for(int j=0;j<len-i;j++){
if((map[i-1][j]==1&&map[i-1][j+1]==1)||(map[i-1][j]==2&&map[i-1][j+1]==2)){
fza--;
if(fza<0) return;
map[i][j]=1;
}
else {
fzb--;
if(fzb<0) return;
map[i][j]=2;
}
}
}
cnt++;
return ;
}
if(aa>0){
map[n][m]=1;
if(m+1==len)
f(n+1,0,aa-1,bb);
else
f(n,m+1,aa-1,bb);
}
if(bb>0){
map[n][m]=2;
if(m+1==len) f(n+1,0,aa,bb-1);
else f(n,m+1,aa,bb-1);
}
}
int main(){
cin>>a>>b;
for(int i=0;i<a+b;i++){
if(i*(i+1)/2==a+b)
len=i;
}
f(0,0,a,b);
cout<<cnt;
return 0;
}