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;
}
}