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

package lq.lq2016;

import java.util.Scanner;

public class RobotTower {
    static int len;
    static int num[] = new int[2];
    static int[] ans = new int[50];
    static int res = 0, m, n;

    static boolean pd(int[] last) {
        int an = 0, bn = 0;
        for (int i = 0; i < len; i++) {
            if (last[i] == 0)
                an++;
            else
                bn++;
        }
        int[] tmp = new int[len];
        for (int i = len; i >= 2; i--) {
            for (int j = 0; j < i - 1; j++) {
                if ((last[j] ^ last[j + 1]) == 0) {
                    an++;
                    tmp[j] = 0;
                } else {
                    bn++;
                    tmp[j] = 1;
                }
            }
            System.arraycopy(tmp, 0, last, 0, len);
        }
        if (an == m && bn == n)
            return true;
        else
            return false;
    }

    static void dfs(int ind) {

        if (ind == len) {

            if (pd(ans)) {
                res++;
                for (int i = 0; i < len; i++) {

                    System.out.print(ans[i]);
                }

                System.out.println();
            }


            return;
        }
        for (int i = 0; i < 2; i++) {

            if (num[i] == 0)
                continue;
            else {
                ans[ind] = i;
                num[i]--;
                dfs(ind + 1);
                num[i]++;
            }
        }
    }

    static int getLen(int sum) {
        int len = 0, tsum = 0;
        for (int i = 1; i <= 50; i++) {
            tsum += i;
            if (tsum == sum) {
                len = i;
                break;
            }
        }

        return len;
    }

    public static void main(String[] args) {
        //
        Scanner sc = new Scanner(System.in);
        m = sc.nextInt();
        n = sc.nextInt();
        num[0] = m;
        num[1] = n;
        len = getLen(m + n);

        dfs(0);
        System.out.println(res);
    }
}

你可能感兴趣的:(dfs)