机器人塔

X星球的机器人表演拉拉队有两种服装,A和B。
他们这次表演的是搭机器人塔。
类似:

队内的组塔规则是:

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,否则按无效代码处理。

解析:由题目分析我们可以知道,只要确定了最后一排的顺序就可以确定一个机器人塔,我们根据这个思路,只要对最后一排进行深搜,将符合条件的情况记录即可。那么这样一个思路我们需要解决的首要问题就是最后一排有几个数,我们要对几个“机器人”进行全排列。因为m+n最多1000个人,所以机器人塔最多会有50层,这里稍微估计一下就能猜出。

// 求出按三角形排列从第1层到第i层有a[i]个元素,非常巧妙的思路
for (int i = 0; i <= 50; i++) {sum += i;a[i] = sum;
}
// 求出在n个A和m个B的情况下,最多能摆到第几层。
for (int i = 0; i <= 50; i++) {if (a[i] == m+n) {maxRow = i;break;}
}

只能说有些代码巧妙地难以理解

import java.util.Scanner;public class Main {static int[] a = new int[1005];static char[] s = new char[1005];static int sum = 0;static int m, n;static int maxRow;static int cnt = 0;static int[] vis = new int[1005];public static void main(String[] args) {Scanner in = new Scanner(System.in);m = in.nextInt();n = in.nextInt();// 求出按三角形排列从第1层到第i层有a[i]个元素,巧妙至极       for (int i = 0; i <= 50; i++) {sum += i;a[i] = sum;}// 求出在n个A和m个B的情况下,最多能摆到第几层。        for (int i = 0; i <= 50; i++) {if (a[i] == m+n) {maxRow = i;break;}}dfs(1);System.out.println(cnt);}private static void dfs(int n) {// TODO Auto-generated method stubif (n == maxRow + 1) {if (check(maxRow)) {cnt++;}return;}if (vis[n] == 0) {vis[n] = 1;s[n] = 'A';dfs(n + 1);s[n] = 'B';dfs(n + 1);vis[n] = 0;}}private static boolean check(int t) {char[] temp = new char[1005];//  将字符串temp从第1位到第s.length()-1位给从temp的第1位开始赋值   System.arraycopy(s, 1, temp, 1, s.length-1);int sum_a = 0, sum_b = 0;while (t != 0) {for (int i = 1; i <= t; i++) {if (temp[i] == 'A') {sum_a++;}if (temp[i] == 'B') {sum_b++;}}//    t--代表上移一排,但是采用的是对数组更新,缩短  for (int i = 1; i <= t-1; i++) {if (temp[i] == temp[i + 1]) {temp[i] = 'A';} else {temp[i] = 'B';}}t--;}if (sum_a == m && sum_b == n) {return true;}return false;}
}

蓝桥杯第七届国赛JAVA真题----机器人塔相关推荐

  1. 蓝桥杯第七届国赛JAVA真题----七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  2. 蓝桥杯第七届国赛JAVA真题----平方末尾

    平方末尾 能够表示为某个整数的平方的数字称为"平方数" 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数. 因为平方数的末位只可能是:[0, 1, ...

  3. 蓝桥杯第七届省赛JAVA真题----压缩变换

    压缩变换 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些序列的特点是,后面 ...

  4. 蓝桥杯第六届国赛JAVA真题----切开字符串

    标题:切开字符串 Pear有一个字符串,不过他希望把它切成两段. 这是一个长度为N(<=10^5)的字符串. Pear希望选择一个位置,把字符串不重复不遗漏地切成两段,长度分别是t和N-t(这两 ...

  5. 蓝桥杯第七届省赛JAVA真题----剪邮票

    剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...

  6. 蓝桥杯第六届国赛JAVA真题----表格计算

    标题:表格计算 某次无聊中, atm 发现了一个很老的程序.这个程序的功能类似于 Excel ,它对一个表格进行操作. 不妨设表格有 n 行,每行有 m 个格子. 每个格子的内容可以是一个正整数,也可 ...

  7. 蓝桥杯第六届国赛JAVA真题----奇怪的数列

    标题:奇怪的数列 从X星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 .... YY博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都 ...

  8. 蓝桥杯第六届国赛JAVA真题----密文搜索

    标题:密文搜索 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一 ...

  9. 蓝桥杯第六届省赛JAVA真题----生命之树

    生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都 ...

最新文章

  1. github上传流程图记录
  2. 智能实验室-全能优化(Guardio) 4.92.0.812
  3. PHP系统编程--01.多进程与多线程
  4. Norse Attack Map网络攻击实时监测地图
  5. Linux设备驱动开发-linux驱动中的阻塞访问方式
  6. java内部类选择题_java内部类详解(附相关面试题)
  7. Python学习笔记之类(四)
  8. 2017.4.26 组合数问题 思考记录
  9. (75)FPGA随机函数($random)
  10. 洛谷P3509 [POI2010]ZAB-Frog
  11. 直播视频网站源码,延迟的几种方式
  12. Linux面试题(34道)
  13. Linux 进程通信
  14. SqlServer误删数据恢复
  15. 美的vs格力 佛山 珠海
  16. windows控制台cmd乱码解决方案
  17. python量化期权_如何20小时搞定Python量化期权实战?
  18. 如何做H5页面阴影悬浮效果
  19. Python爬虫403错误的解决方案
  20. javajavajava

热门文章

  1. php防止跨域提交,PHP防止跨域提交表单的简单示例
  2. express html文件接收路由参数,express 获取post 请求参数
  3. java map 优化_java.util.map和java.util.set的优化实现?
  4. Java程序员周末时间搞锭银行信息管理系统毕业设计(java+springboot+mybatis+mysql+vue+elementui)等实现
  5. java8 lambda map排序_Java8新特性第3章(Stream API)
  6. 希尔排序--Java
  7. java在原数组中追加一个元素
  8. 内网通看不到其他人_小学生在新版本里用“吃鸡内挂”,巡查员:封不了,手机自带的...
  9. java多线程 future_Java多线程Future模式
  10. 【OpenCV 例程200篇】35. 图像的投影变换(边界填充)