java实现第七届蓝桥杯机器人塔

机器人塔

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

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

import java.util.Scanner;

public class Main {
    public static int m, n;
    public static int[][] value;   //此处用数字1代表A,数字2代表B
    public static int len, count = 0;
    
    public void check() {
        for(int i = len - 2, t = 1;i >= 0;i--, t++)
            for(int j = 0;j < len - t;j++) {
                if(value[i + 1][j] == value[i + 1][j + 1])
                    value[i][j] = 1;
                else
                    value[i][j] = 2;
            }
        int sumA = 0, sumB = 0;
        for(int i = 0, t = len - 1;i < len;i++, t--)
            for(int j = 0;j < len - t;j++) {
                if(value[i][j] == 1)
                    sumA++;
                else if(value[i][j] == 2)
                    sumB++;
            }
        if(sumA == m && sumB == n)
            count++;
    }
    
    public void dfs(int step) {
        if(step == len) {
            check();
            return;
        } else {
            for(int i = 1;i <= 2;i++) {
                value[len - 1][step] = i;   //确定三角形最底层一行,即可确定整个三角形
                dfs(step + 1);
            }
        }
    }
    
    
    public static void main(String[] args) {
        Main test = new Main();
        Scanner in = new Scanner(System.in);
        m = in.nextInt();   
        n = in.nextInt();
        for(int i = 1;i < 100;i++) {   //满足三角形规则,可知i层,则(i + 1) * i / 2 = m + n
            int a = (i + 1) * i / 2;
            if(a == m + n) {
                len = i;
                value = new int[a][a];
                break;
            }
        }
        test.dfs(0);
        System.out.println(count);
    }
}
原文地址:https://www.cnblogs.com/a1439775520/p/13077073.html