机器人塔
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的人数,保证人数合理性。
要求输出一个整数,表示可以产生的花样种数。
例如:
用户输入:
2
程序应该输出:
再例如:
用户输入:
3
程序应该输出:
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
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的人数,保证人数合理性。
要求输出一个整数,表示可以产生的花样种数。
例如:
用户输入:
2
程序应该输出:
再例如:
用户输入:
3
程序应该输出:
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
import java.util.LinkedList;
import java.util.Scanner;
public class 机器人塔 {
/**
* @param args
*/
static int num=0;
static int t=0;//最后一行的数量
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
int m=sc.nextInt();//a数
int n=sc.nextInt();//b数
int s=m+n;
//最后一行的数量
for (int i = 1; i <100000 ; i++) {
if(i*i+i-2*s==0){
t=i;
break;
}
}
// System.out.println(t+"&&");
// System.out.println(m+" "+n+" "+t);
LinkedList<Integer> list=new LinkedList<Integer>();
dfs(0,list,m,n);
System.out.println(num);
}
/**
*
* @param k 当前焦点
* @param list 存贮
* @param m a的个数
* @param n b的个数
*
*/
private static void dfs(int k, LinkedList<Integer> list,int m,int n) {
if(k==t){
// System.out.println(11);
if(check(list,m,n)){
num++;
}
return;
}
// System.out.println(list);
for (int i = 1; i <= 2; i++) {
list.add(i);
if(i==1 && m>0){
dfs(k+1,list,m-1,n);
}else if(i==2 && n>0){
dfs(k+1,list,m,n-1);
}
list.removeLast();
}
}
/**
* 统计塔中的ab的数量
* @param list
* @param n
* @param m
* @return
*/
private static boolean check(LinkedList<Integer> list, int m, int n) {
int w=list.size();
int x[][]=new int[w][w];
//放进二维数组中
// System.out.println(w);
for (int j = 0; j < x[0].length; j++) {
// System.out.println(111);
x[w-1][j]=list.get(j);
}
// System.out.println(m+"+++"+n);
for (int i = w-2; i >=0; i--) {//hang
if(m>=0&&n>=0){
for (int j = 0; j <= i; j++) {//lie
if(x[i+1][j]!=x[i+1][j+1]){
x[i][j]=2;
n--;
}else {
x[i][j]=1;
m--;
}
}
}else {
return false;
}
}
if(m==0&&n==0){
return true;
}else {
return false;
}
}
}