机器人塔
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 }