蓝桥杯——剪邮票(2016JavaB组第10题)
剪邮票(16JavaB10)
如【图1】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2】,【图3】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
问题分析
按题目,从1开始计数的话:
|-同行:(id-1)÷4的结果相等,左右邻:相减±1
|-同列:%4的结果相等,上下邻:相减±4
使用深度优先遍历,
深度优先:推进到底,触底再回
比如:{3,5,6,7,10}
先查找3跟{3,5,6,7,10}的谁相邻:
3-X
5-X
6-X
7-OK
10-等待
3-7匹配上了,继续推进,比较7和谁相邻(3已经比过了,算不匹配):
3-X
5-X
6-OK
7-等待
10-等待
7-6匹配上了,继续推进,比较6和谁相邻:
3-X
5-OK
6-等待
7-等待
10-等待
虽然6和10页相邻,但是”深度优先”,先推进下去,不管10。
5没有再相邻的,所以回到6,再匹配到10。
深度递归:
|-先推进到底,走不通了再回头
|-只要每个点都能走到,说明是连着的
package bb;
import java.util.HashSet;
import java.util.Set;
public class 剪邮票 {
private static boolean check(int a[]) {
boolean flag[] = new boolean[5];
dfs(a, flag, 0);
return flag[0] && flag[1] && flag[2] && flag[3] && flag[4];
}
// 深度优先搜索
private static void dfs(int a[], boolean[] flag, int n) {
flag[n] = true;
for (int i = 0; i < 5; i++) {
// 同行:(id-1)÷4的结果相等,左右邻:加减为1
// 不能用÷5,一行就4个(9÷5==1,10÷5==2)
if (!flag[i] && ((a[i] - 1) / 4 == (a[n] - 1) / 4)
&& (a[i] == a[n] - 1 || a[i] == a[n] + 1)) {
dfs(a, flag, i);
}
// 同列:%4的结果相等,上下邻:加减为4
if (!flag[i] && (a[i] % 4 == a[n] % 4) && (a[i] == a[n] - 4 || a[i] == a[n] + 4)) {
dfs(a, flag, i);
}
}
}
static Set<String> cutStamps() {
int[] a = new int[5];
Set<String> _set = new HashSet<String>();
int START = 0 + 1;
int END = 12 + 1;
for (a[0] = START; a[0] < END; ++a[0]) {
for (a[1] = a[0] + 1; a[1] < END; ++a[1]) {
for (a[2] = a[1] + 1; a[2] < END; ++a[2]) {
for (a[3] = a[2] + 1; a[3] < END; ++a[3]) {
for (a[4] = a[3] + 1; a[4] < END; ++a[4]) {
if (check(a)) {
_set.add("" + a[0] + " " + a[1] + " " + a[2] + " " + a[3] + " "
+ a[4]);
}
}
}
}
}
}
return _set;
}
public static void main(String[] args) {
Set<String> _set1 = cutStamps();
System.out.println(_set1.size());
System.out.println(_set1.contains("2 6 7 11 12"));
System.out.println(_set1.contains("3 5 6 7 10"));
}
}
蓝桥杯——剪邮票(2016JavaB组第10题)的更多相关文章
- 第七届蓝桥杯省赛javaB组 第七题剪邮票
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的 ...
- 蓝桥杯 剪邮票 全排列+DFS
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...
- java实现第七届蓝桥杯剪邮票
剪邮票 题目描述 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所 ...
- 蓝桥杯 剪邮票(dfs枚举 + bfs)
剪邮票 如图1, 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,图2,图3中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的 ...
- 蓝桥杯 剪邮票 DFS (不错的题目)
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的 ...
- 蓝桥杯——复数幂 (2018JavaAB组第3题)
18年Java蓝桥杯A组第3题和B组是一样的. 第三题往往比较难. 复数幂 (18JavaAB3) (A.B两卷第三题一样) 设i为虚数单位.对于任意正整数n,(2+3i)^n 的实部和虚部都是整数. ...
- 蓝桥杯——快速排序(2018JavaB组第5题9分)
快速排序(18JavaB5,9') 以下代码可以从数组a[]中找出第k小的元素. 它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的. 请仔细阅读分析源码,填写划线部分缺失的内容. impo ...
- 2015年蓝桥杯省赛B组第3题--三羊献瑞
三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞 ------------------- 三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的 ...
- 蓝桥杯——分组比赛(2017JavaB组第3题)
分组比赛(17JavaB3) 9名运动员参加比赛,需要分3组进行预赛. 有哪些分组的方案呢? 标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法: ABC DEF GHI ABC D ...
随机推荐
- E. Enemy is weak 解析(思維、離散化、BIT、線段樹)
Codeforce 61 E. Enemy is weak 解析(思維.離散化.BIT.線段樹) 今天我們來看看CF61E 題目連結 題目 給一個數列\(a\),求有多少\((i,j,k)\),\(i ...
- 一起学Vue:路由(vue-router)
前言 学习vue-router就要先了解路由是什么?前端路由的实现原理?vue-router如何使用?等等这些问题,就是本篇要探讨的主要问题. vue-router是什么 路由是什么? 大概有两种说法 ...
- 【CF1443F】Identify the Operations 题解
原题链接 题意简介 建议去原题看.这题意我表达不清楚. 大概就是给你一个 n 的排列,现在要求你进行 m 次操作. 每次操作,你会在现有的排列中删去一个数,然后选择其左边或右边的一个与之相邻的数加入 ...
- 【Luogu】P1072 Hankson 的趣味题 题解
原题链接 嗯...通过标签我们易得知,这是一道数学题(废话) 其中,题目给了这两个条件: \(gcd(x,a_0)=a_1,lcm(x,b_0)=b_1\) 所以,根据 \(gcd\) 与 \(lcm ...
- 深入IOC及其启动原理
IOC总结 1. IOC概述 三个问题: IOC是什么 为什么用它 怎么用 1.1 是什么? 两个概念:控制反转,依赖注入 来看一下传统的干活方式:在对象单一职责原则的基础上,一个对象很少有不依赖其他 ...
- MapReduce在Shuffle阶段按Mapper输出的Value进行排序
ZKe ----------------- 在MapReduce框架中,Mapper的输出在Shuffle阶段,根据Key值分组之后,还将会根据Key值进行排序,因此Reducer的输出我们看到的结果 ...
- PriorityQueue原理分析——基于源码
在业务场景中,处理一个任务队列,可能需要依照某种优先级顺序,这时,Java中的PriorityQueue(优先队列)便可以派上用场.优先队列的原理与堆排序密不可分,可以参考我之前的一篇博客: 堆排序总 ...
- 内网渗透 day3 -metasploit的使用
metasploit的使用 目录 一.msf基本操作 1 二.msf模块(比较重要的四个) 2 三.木马生成 2 四.开启监听模块(最常用的模块) 3 一.msf基本操作 1. 使用msfconsol ...
- vi&vim 基本使用方法
vi/&vim 基本使用方法 本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了!i/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅 ...
- CSS之calc()
calc() 函数支持任意CSS长度单位的混合计算,遵循标准数学运算优先级规则,可以动态计算长度值.注意,calc()函数内部的运算符两侧各加一个空白符,否则会产生解析错误. calc()使用的难点在 ...