蓝桥杯决赛 机器人塔

机器人塔

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 , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

#include<iostream>
#include<cmath>
using namespace std;
int n,m,line;
string path,res;
int ans;
bool new_string(string path,int cnta,int cntb){//递归求上面的字符串是否可以生成
    res="";
    for(int i=0;i<path.size()-1;i++){
        string tmp=path.substr(i,2);
        if((tmp=="AA"||tmp=="BB")&&cnta){
            res+="A";
            cnta--;
        }
        else if((tmp=="AB"||tmp=="BA")&&cntb){
            res+="B";
            cntb--;
        }
        else return false;
    }
    if(res.size()==1)return true;
    return new_string(res,cnta,cntb);
}
void dfs(int u,int cnta,int cntb){//先确定底层
    if(u==line&&cnta>=0&&cntb>=0){
        if(new_string(path,cnta,cntb)){
            ans++;
        }
        return ;
    }
    if(cnta>0){
        path+="A";
        dfs(u+1,cnta-1,cntb);
        path.pop_back();
    }
    if(cntb>0){
        path+="B";
        dfs(u+1,cnta,cntb-1);
        path.pop_back();
    }
}
int main(){
    cin>>n>>m;
    line=sqrt(2*(n+m));
    dfs(0,n,m);
    cout<<ans<<endl;
    return 0;
}
posted @ 2020-11-03 20:32  进化の程序猿  阅读(116)  评论(0编辑  收藏  举报