机器人塔

1、问题描述

机器人塔

X星球的机器人表演拉拉队有两种服装,A和B。
他们这次表演的是搭机器人塔。

这里写图片描述

队内的组塔规则是:

A 只能站在 AA 或 BB 的肩上。
B 只能站在 AB 或 BA 的肩上。

你的任务是帮助拉拉队计算一下,在给定A与B的人数时,可以组成多少种花样的塔。

输入一行两个整数 M 和 N,空格分开(0

2、思路

把A看成是数字1,把B看成是数字2,利用dfs搜索,在判断是否符合条件

3、代码

/**
 * 机器人塔
 * @description
 * @author zhangbiao
 * @time 2018-5-21 下午3:53:36
 */
public class Main14 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        M=sc.nextInt(); 
        N=sc.nextInt(); 
        int[] a=new int[N+M];   //保存到数组中
        dfs(a,0);
        System.out.println(num);
    }
    static int num=0;
    static int M;   //A服装人数,这里用1表示
    static int N;   //B服装人数,这里用2表示
    static int m=0; //符合条件的个数A
    static int n=0; //符合条件的个数B
    /**
     * dfs搜索
     * @param c 保存数据的数组
     * @param k 填入数组中符合条件的个数
     */
    public static void dfs(int[] c,int k){
        if(k==c.length){
            //符合条件的个数跟给定的值相等
            if(m==M&&n==N){
                if(judge(c)){
                    //判断数组是否符合要求
                    num++;
                    //打印自己验证一下
                    System.out.println(Arrays.toString(c));
                }
            }
        }else{
            //由于上面是k==c.length的判断条件,所以要加else,如果不加,当k=c.length时,数组会越界
            for(int i=1;i<=2;i++){
                if(i==1){
                    //模拟A服装
                    c[k]=i;
                    m++;
                    dfs(c, k+1);
                    m--;
                    c[k]=0;
                }else if(i==2){
                    //模拟B服装
                    c[k]=i;
                    n++;
                    dfs(c, k+1);
                    n--;
                    c[k]=0;
                }
            }
        }
    }
    /**
     * 判断数组是否符合条件
     * @param a
     * @return
     */
    public static boolean judge(int[] a){
        int i=0;
        //从第一行开始(最后一行不用判断,因此总数可以用i+j表示)
        for(int j=1;i+j<a.length;j++){
            //每行的个数
            for(int k=0;k<j;k++){
                if(a[i]==1){
                    //A只能站在AA或者BB上,如果A站着下面两个不相等的话,不符合条件
                    if(a[i+j]!=a[i+j+1]){
                        return false;
                    }
                }
                if(a[i]==2){
                    //B只能站在AB,BA上面,如果B下面站着两个相等的话,不符合条件
                    if(a[i+j]==a[i+j+1]){
                        return false;
                    }
                }
                i++;
            }
        }
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/shaonianbz/article/details/80395167