zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
  • 相关阅读:
    【算法】哈希表法四部曲
    【算法】位运算技巧
    【算法】分治法四步走
    【算法】分支界限三步走
    【Java】位操作符
    【Java】String字符串格式化
    阿里一面,给了几条SQL,问需要执行几次树搜索操作?
    c++随机数问题研究
    Google单元测试框架gtest之官方sample笔记4--事件监控之内存泄漏测试
    Google单元测试框架gtest之官方sample笔记3--值参数化测试
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13077233.html
Copyright © 2011-2022 走看看