机器人塔

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,否则按无效代码处理。

 先求出最后一行可能的情况,在一次往上推,符合条件就找到一种。

 1 import java.util.Arrays;
 2 import java.util.Scanner;
 3 
 4 
 5 public class Main{
 6     static int n;
 7     static int[] c;
 8     static int sum;
 9     public static void main(String[] args) {
10         Scanner input = new Scanner(System.in);
11         int a = input.nextInt();
12         int b = input.nextInt();
13         while(n+n*n!=2*(a+b)){
14             n++;
15         }
16         c = new int[n];
17         f(a,b,0);
18         System.out.println(sum);
19     }
20     public static void f(int a,int b,int h){
21         if(h>=n){
22             f1(a,b,h-1,c);
23             return;
24         }
25         if(a>0){
26             c[h] = 0;
27             f(a-1,b,h+1);
28         }
29         if(b>0){
30             c[h] = 1;
31             f(a,b-1,h+1);
32         }
33     }
34     public static void f1(int a,int b,int h,int[] d){
35         if(a<0||b<0){
36             return;
37         }
38         if(h==0&&a==0&&b==0){
39             sum++;
40             return;
41         }
42         int[] temp = new int[h];
43         for(int i=0;i<h;i++){
44             if(d[i]==d[i+1]){
45                 temp[i] = 0;
46                 a--;
47             }else{
48                 temp[i] = 1;
49                 b--;
50             }
51         }
52         f1(a,b,h-1,temp);
53     }
54     
55 }
原文地址:https://www.cnblogs.com/lolybj/p/6883962.html