机器人塔
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
package lq.lq2016;
import java.util.Scanner;
public class RobotTower {
static int len;
static int num[] = new int[2];
static int[] ans = new int[50];
static int res = 0, m, n;
static boolean pd(int[] last) {
int an = 0, bn = 0;
for (int i = 0; i < len; i++) {
if (last[i] == 0)
an++;
else
bn++;
}
int[] tmp = new int[len];
for (int i = len; i >= 2; i--) {
for (int j = 0; j < i - 1; j++) {
if ((last[j] ^ last[j + 1]) == 0) {
an++;
tmp[j] = 0;
} else {
bn++;
tmp[j] = 1;
}
}
System.arraycopy(tmp, 0, last, 0, len);
}
if (an == m && bn == n)
return true;
else
return false;
}
static void dfs(int ind) {
if (ind == len) {
if (pd(ans)) {
res++;
for (int i = 0; i < len; i++) {
System.out.print(ans[i]);
}
System.out.println();
}
return;
}
for (int i = 0; i < 2; i++) {
if (num[i] == 0)
continue;
else {
ans[ind] = i;
num[i]--;
dfs(ind + 1);
num[i]++;
}
}
}
static int getLen(int sum) {
int len = 0, tsum = 0;
for (int i = 1; i <= 50; i++) {
tsum += i;
if (tsum == sum) {
len = i;
break;
}
}
return len;
}
public static void main(String[] args) {
//
Scanner sc = new Scanner(System.in);
m = sc.nextInt();
n = sc.nextInt();
num[0] = m;
num[1] = n;
len = getLen(m + n);
dfs(0);
System.out.println(res);
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容