2016年蓝桥杯决赛-机器人塔


机器人塔

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

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

 思路:不敢说完全满足题目条件,暴力搜索写的,

#include<cstdio>
#include<iostream>
#include<functional>
#include<algorithm>
using namespace std;
int sum, a, b, n;
int tree[505][505], arr[1005];
bool check()
{
    for (int i = 1; i < n; i++){
        for (int j = 0; j < i; j++){
            if (tree[i][j] != tree[i + 1][j] * tree[i + 1][j + 1])
                return false;
        }
    }
    return true;
}
void dfs(int anum, int bnum,int d)
{
    if (d == a + b){
        if (check()){
            sum++;    
        }
    }
    else {
        int index = upper_bound(arr, arr + 1005, d) - arr;
        int index2 = d - arr[index - 1];
        //cout << " d = " << d << " index = " << index << " index2 = " << index2 << endl;
        if (anum > 0){
            tree[index][index2] = 1;
            dfs(anum - 1, bnum, d + 1);
        }
        if (bnum > 0){
            tree[index][index2] = -1;
            dfs(anum, bnum - 1, d + 1);
        }
    }
}
int main()
{
    arr[0] = 0;
    for (int i = 1; i < 1005; i++){
        if (i == 1) arr[i] = 1;
        else arr[i] = arr[i - 1] + i;
    }
    
    while (cin >> a >> b){
        sum = 0;
        for (int i = 1; i < 1005; i++){
            n = i;
            if (n*n + n == 2 * (a + b))
                break;
        }
        dfs(a, b, 0);
        cout << sum << endl;
    }
    return 0;
}

 

posted @ 2018-05-18 21:56  我只有一件白T恤  阅读(335)  评论(0编辑  收藏  举报