2016 蓝桥杯 国赛 JAVA A组第四题 机器人塔
2017-08-03 10:23
288 查看
机器人塔
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,否则按无效代码处理。
思路:从上到下遍历,第一层只有一个,为A或B,上面的a[i][j]可以决定下面a[i+1][j]和a[i+1][i+1]的情况,当a[i+1][j]中j=0时,决定
a[i+1][j]和a[i+1][j+1],但是j!=时,a[i+1][j]已经存在,所以只能决定a[i+1][j+1]
当A和B的数量都为0时,即为一种情况,结果加1
package 总决赛;
import java.io.*;
import java.util.Scanner;
public class 机器人塔 {
static int re = 0;//最后结果
//先根据输入的m+n求总共多少层
static int cs(int m,int n){
int num = m+n,c = 0;
for(int i=1;i<num;i++){
c += i;
if(c == num)
return i;
}
return 0;
}
// 0 0
static void dfs(char a[][],int cm,int cn,int M,int N,int d){//
//参数列表从左到右依次为:存所有A和B的数组,当前递归所在的行号、列号,A和B剩余的个数,当前递归的层数(一开始要赋1)
//从上
4000
到下递归
if(M <0 || N<0)
return;
if(M == 0 && N==0 )
{
re++;
return;
}
if(cn ==0){
if(a[cm][cn] == 'A'){//下面两个为AA或BB
a[cm+1][cn] = a[cm+1][cn+1] = 'A';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M-2,N,d+(cn+1)/d);
a[cm+1][cn] = a[cm+1][cn+1] = 'B';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M,N-2,d+(cn+1)/d);
}
else{//下面两个为AB或BA
a[cm+1][cn] = 'B';a[cm+1][cn+1] = 'A';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M-1,N-1,d+(cn+1)/d);
a[cm+1][cn] = 'A';a[cm+1][cn+1] = 'B';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M-1,N-1,d+(cn+1)/d);
}
}
else{
if(a[cm][cn] == 'A'){
if(a[cm+1][cn] == 'A'){//a[cm+1][cn+1]一定为A
a[cm+1][cn+1] = 'A';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M-1,N,d+(cn+1)/d);
}
else{//a[cm+1][cn]一定为B
a[cm+1][cn+1] = 'B';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M,N-1,d+(cn+1)/d);
}
}
else{
if(a[cm+1][cn] == 'A'){//a[cm+1][cn]一定为B
a[cm+1][cn+1] = 'B';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M,N-1,d+(cn+1)/d);
}
else{//a[cm+1][cn]一定为A
a[cm+1][cn+1] = 'A';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M-1,N,d+(cn+1)/d);
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
int M = s.nextInt(),N = s.nextInt();
int c = cs(M,N);
// System.out.println(c);
char a[][] = new char [c][];
for(int i=0;i<c;i++){
a[i] = new char[i+1];
}
a[0][0] = 'A';
dfs(a,0,0,M-1,N,1);
a[0][0] = 'B';
dfs(a,0,0,M,N-1,1);
System.out.println(re);
}
}
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,否则按无效代码处理。
思路:从上到下遍历,第一层只有一个,为A或B,上面的a[i][j]可以决定下面a[i+1][j]和a[i+1][i+1]的情况,当a[i+1][j]中j=0时,决定
a[i+1][j]和a[i+1][j+1],但是j!=时,a[i+1][j]已经存在,所以只能决定a[i+1][j+1]
当A和B的数量都为0时,即为一种情况,结果加1
package 总决赛;
import java.io.*;
import java.util.Scanner;
public class 机器人塔 {
static int re = 0;//最后结果
//先根据输入的m+n求总共多少层
static int cs(int m,int n){
int num = m+n,c = 0;
for(int i=1;i<num;i++){
c += i;
if(c == num)
return i;
}
return 0;
}
// 0 0
static void dfs(char a[][],int cm,int cn,int M,int N,int d){//
//参数列表从左到右依次为:存所有A和B的数组,当前递归所在的行号、列号,A和B剩余的个数,当前递归的层数(一开始要赋1)
//从上
4000
到下递归
if(M <0 || N<0)
return;
if(M == 0 && N==0 )
{
re++;
return;
}
if(cn ==0){
if(a[cm][cn] == 'A'){//下面两个为AA或BB
a[cm+1][cn] = a[cm+1][cn+1] = 'A';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M-2,N,d+(cn+1)/d);
a[cm+1][cn] = a[cm+1][cn+1] = 'B';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M,N-2,d+(cn+1)/d);
}
else{//下面两个为AB或BA
a[cm+1][cn] = 'B';a[cm+1][cn+1] = 'A';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M-1,N-1,d+(cn+1)/d);
a[cm+1][cn] = 'A';a[cm+1][cn+1] = 'B';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M-1,N-1,d+(cn+1)/d);
}
}
else{
if(a[cm][cn] == 'A'){
if(a[cm+1][cn] == 'A'){//a[cm+1][cn+1]一定为A
a[cm+1][cn+1] = 'A';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M-1,N,d+(cn+1)/d);
}
else{//a[cm+1][cn]一定为B
a[cm+1][cn+1] = 'B';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M,N-1,d+(cn+1)/d);
}
}
else{
if(a[cm+1][cn] == 'A'){//a[cm+1][cn]一定为B
a[cm+1][cn+1] = 'B';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M,N-1,d+(cn+1)/d);
}
else{//a[cm+1][cn]一定为A
a[cm+1][cn+1] = 'A';
dfs(a,cm+(cn+1)/d,(cn+1)%d,M-1,N,d+(cn+1)/d);
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
int M = s.nextInt(),N = s.nextInt();
int c = cs(M,N);
// System.out.println(c);
char a[][] = new char [c][];
for(int i=0;i<c;i++){
a[i] = new char[i+1];
}
a[0][0] = 'A';
dfs(a,0,0,M-1,N,1);
a[0][0] = 'B';
dfs(a,0,0,M,N-1,1);
System.out.println(re);
}
}
相关文章推荐
- 第七届蓝桥杯决赛JavaA组第四题_机器人塔
- 广场舞--2016蓝桥杯 国赛 JAVA A组 第5题
- 2016 第七届 蓝桥杯 国赛 机器人塔
- 2016 蓝桥杯国赛 JAVA B组第三题 打靶
- 机器人繁殖--第六届蓝桥杯国赛 C语言 C组第四题
- 2016 蓝桥杯 国赛 JAVA A组第二题 凑平方数
- 第八届蓝桥杯国赛Java b组 第四题
- 蓝桥杯第七届国赛JAVA真题----机器人塔
- 第八届蓝桥杯国赛Java b组 第六题
- 生成回文数 --第六届蓝桥杯国赛JAVA C组
- 2016 第七届 蓝桥杯 国赛 路径之谜
- 2016蓝桥杯A组java第三题
- 2016 第七届 蓝桥杯 国赛 碱基
- 2016 蓝桥杯 JavaB组 省赛
- 第三届蓝桥杯Java高职组决赛第四题
- 2016第七届蓝桥杯 03 平方怪圈(java)
- 2016蓝桥杯javaA组第3题
- 2018年第八届蓝桥杯 JavaB组国赛 第二题 生命游戏 解答
- 第八届蓝桥杯国赛Java b组 第一题
- [蓝桥杯]第三届Java高职组决赛第四题