原题链接:https://www.dotcpp.com/oj/problem1837.html
题目描述
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的人数,保证人数合理性。
要求输出一个整数,表示可以产生的花样种数。
输入
输入一行两个整数 M 和 N,空格分开(0<M,N<500),分别表示A、B的人数,保证人数合理性。
输出
要求输出一个整数,表示可以产生的花样种数。
样例输入
1 2
样例输出
3
早年的蓝桥杯数据有点诡异,按理来说,500x500的数据规模,这种搜索应该A不了,不过思路还是对滴,从最后一排开始搜到开头,中途来些剪枝,还有就是要小心从下一行第一个跳到上一行的最后一个,如何实现
import java.util.Scanner;
public class 机器人塔 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
A = in.nextInt();
B = in.nextInt();
n = 1;
while(n*(n+1)<A+B)
n++;
ch = new char[n+5][n+5];
dfs(n,n);
System.out.println(ans);
}
static int n,A,B,ans=0;
static char[][] ch;
static void dfs(int x,int y) {
if(x==0 && y==0) {
ans++;
return;
}
if(x==n) {
A--;
ch[x][y] = 'A';
if(y-1==0)
dfs(x-1,x-1);
else
dfs(x,y-1);
A++;
B--;
ch[x][y] = 'B';
if(y-1==0)
dfs(x-1,x-1);
else
dfs(x,y-1);
B++;
}else {
if(A>0 && (ch[x+1][y]=='A' && ch[x+1][y+1]=='A') || (ch[x+1][y]=='B' && ch[x+1][y+1]=='B')) {
A--;
ch[x][y] = 'A';
if(y-1==0)
dfs(x-1,x-1);
else
dfs(x,y-1);
A++;
}
if(B>0 && (ch[x+1][y]=='A' && ch[x+1][y+1]=='B') || (ch[x+1][y]=='B' && ch[x+1][y+1]=='A')) {
B--;
ch[x][y] = 'B';
if(y-1==0)
dfs(x-1,x-1);
else
dfs(x,y-1);
B++;
ch[x][y] = '*';//这个回溯其实没什么必要
}
}
}
}