蓝桥杯之机器人塔
来源:互联网 发布:mac出现五国 升级 编辑:程序博客网 时间:2024/04/30 02:37
X星球的机器人表演拉拉队有两种服装,A和B。
他们这次表演的是搭机器人塔。
类似:
A B B A B A A A B B B B B A BA 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
思路:先构建最底层,然后上面的每一层都只能依次从下面的层得到唯一的解(注意:这里判重,重复了就return ;否则往下走)。所以,我们只需要求出最底层的排列顺序,并且注意到构建完最后一层即第一层的时候,a的个数和b的个数是不是刚刚好用完。
package 第七届;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Scanner;import java.util.Set;//知道最底下的一层,就知道上面的是如何排列的了public class Exe76 { static int count = 0 ; static List<String> list = new ArrayList<>(); static Set<String> answer = new HashSet<>(); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int b = scanner.nextInt(); int sum = (a+b)*2; //三角形的总个数(从1开始计数)是:sum=(1+n)*n/2; int bottom = (int) Math.sqrt(sum); //如果个数不是符合这个公式的话,就构不成一个三角形。变形为:n*(n+1) = sum*2; if (bottom*(bottom+1)!=sum) { System.out.println("构不成三角形"); return ; } char num[][] = new char[bottom][]; for (int i = 0; i < num.length; i++) { num[i] = new char[i+1]; } dfs(num,a,b,0); System.out.println(answer.size()); } private static void dfs(char[][] num, int a, int b, int begin) { if (a<0||b<0) { return ; } if (begin>=num[num.length-1].length) { if (!list.contains(new String(num[num.length-1]))) { list.add(new String(num[num.length-1])); check(num,a,b); } return ; } for (int i = begin; i < num[num.length-1].length; i++) { for (int j = 0; j <= 1 ; j++) { num[num.length-1][i] = (char)(j+'A'); if (j==0) { dfs(num, a-1, b,begin+1); } else { dfs(num, a, b-1,begin+1); } } } } private static void check(char[][] num, int a, int b) { for (int i = num.length-1; i > 0; i--) { for (int j = 0; j < num[i].length-1; j++) { if (num[i][j]==num[i][j+1]) { num[i-1][j] = 'A'; a--; if (a<0) { return ; } } else { num[i-1][j] = 'B'; b--; if (b<0) { return ; } } } } StringBuffer sb = new StringBuffer(""); for (int i = 0; i < num.length; i++) { for (int j = 0; j < num[i].length; j++) { sb.append(num[i][j]); } } answer.add(new String(sb)); }}
阅读全文
1 0
- 蓝桥杯之机器人塔
- 蓝桥杯之机器人繁殖
- 机器人塔
- 机器人塔
- 机器人塔
- 人工智能之机器人
- ABB机器人之LOADDATA
- 机器人之变形金刚
- 蓝桥杯--第七届决赛:机器人塔
- 2016蓝桥杯决赛 机器人塔(深搜DFS)
- 2016 第七届 蓝桥杯 国赛 机器人塔
- 2016蓝桥杯决赛 机器人塔(深搜DFS)
- Nao机器人之刷新USBKey
- 魔方机器人之硬件篇
- 魔方机器人之调试篇
- 魔方机器人之结构篇
- C#实例之聊天机器人
- Android之智能问答机器人
- AJAX验证码检查
- redis持久化方法对比分析
- C# .net 多线程中集合数据同步
- 为什么我要改用Kotlin
- 可检测眼睛运动的感知技术上线,成本低速度快
- 蓝桥杯之机器人塔
- Hadoop本地提交到集群中
- 微信公众号开发——关注来源
- 存储基础:DAS/NAS/SAN存储类型及应用
- 45-数字调换
- (Kotlin1)初识Kotlin编程语言
- eclipse视图下看不到classes目录
- centos7如何添加开机启动服务/脚本
- STM32-新建工程