第七届蓝桥杯大赛个人赛(软件类)决赛——机器人塔

来源:互联网 发布:五分彩计划软件 编辑:程序博客网 时间:2024/05/16 18:50

题目:

机器人塔

X星球的机器人表演拉拉队有两种服装,A和B。
他们这次表演的是搭机器人塔。
类似:
这里写图片描述

队内的组塔规则是:

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

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

下面是我的解法:

static int m=0;    static int n=0;    static int sum=0;    public static void main(String[] args) {        Scanner scan=new Scanner(System.in);        m=scan.nextInt();        n=scan.nextInt();        scan.close();        int num=0;        for(int i=1;i<=m+n;i++) {            if(i+i*i==2*(m+n)){                num=i;                break;            }        }        int [][]x=new int [num][2*num-1];        diedai(x,0,0,0);        System.out.println(sum);    }    public static void jisuan(int [][]x,int now,int num1,int num2) {        int num11=num1;        int num21=num2;        if(now<x.length) {            for(int i=1;i<x[0].length-1;i++) {                if(x[now-1][i-1]==2&&x[now-1][i+1]==2||x[now-1][i-1]==1&&x[now-1][i+1]==1) {                    x[now][i]=1;                    num11++;                    if(num11>m) {                        return ;                    }                }else if(x[now-1][i-1]==1&&x[now-1][i+1]==2||x[now-1][i-1]==2&&x[now-1][i+1]==1) {                    x[now][i]=2;                    num21++;                    if(num21>n) {                        return;                    }                }            }            jisuan(x,now+1,num11,num21);        }else if(now==x.length){            if(num11==m&&num21==n) {                sum++;            }        }    }    public static void diedai(int [][]x,int now,int a,int b) {        if(now<x[0].length) {            x[0][now]=1;            if(a<=m) {                diedai(x,now+2,a+1,b);            }            x[0][now]=2;            if(b<=n) {                diedai(x,now+2,a,b+1);            }            b--;        }else {            jisuan(x,1,a,b);            return ;        }    }
0 0