剪邮票(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题)的更多相关文章

  1. 第七届蓝桥杯省赛javaB组 第七题剪邮票

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

  2. 蓝桥杯 剪邮票 全排列+DFS

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

  3. java实现第七届蓝桥杯剪邮票

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

  4. 蓝桥杯 剪邮票(dfs枚举 + bfs)

    剪邮票 如图1, 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,图2,图3中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的 ...

  5. 蓝桥杯 剪邮票 DFS (不错的题目)

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

  6. 蓝桥杯——复数幂 (2018JavaAB组第3题)

    18年Java蓝桥杯A组第3题和B组是一样的. 第三题往往比较难. 复数幂 (18JavaAB3) (A.B两卷第三题一样) 设i为虚数单位.对于任意正整数n,(2+3i)^n 的实部和虚部都是整数. ...

  7. 蓝桥杯——快速排序(2018JavaB组第5题9分)

    快速排序(18JavaB5,9') 以下代码可以从数组a[]中找出第k小的元素. 它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的. 请仔细阅读分析源码,填写划线部分缺失的内容. impo ...

  8. 2015年蓝桥杯省赛B组第3题--三羊献瑞

    三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉   +   三 羊 献 瑞 -------------------    三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的 ...

  9. 蓝桥杯——分组比赛(2017JavaB组第3题)

    分组比赛(17JavaB3) 9名运动员参加比赛,需要分3组进行预赛. 有哪些分组的方案呢? 标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法: ABC DEF GHI ABC D ...

随机推荐

  1. D. Generating Sets 解析(思維)

    Codeforce 722 D. Generating Sets 解析(思維) 今天我們來看看CF722D 題目連結 題目 略,請直接看原題 前言 真的是沒想到... @copyright petje ...

  2. D. Tavas and Malekas 解析(字串匹配)

    Codeforce 535 D. Tavas and Malekas 解析(字串匹配) 今天我們來看看CF535D 題目連結 題目 給你一個字串$p$和一些$index$代表字串$p$在哪些位置會和長 ...

  3. [LuoguP2147] [SDOI2008]洞穴勘测 (LCT维护连通性)

    题面 传送门:https://www.luogu.org/problemnew/show/P2147 Solution 这题...... 我们可以发现题目要求我们维护一个动态森林,而且只查询连通性.. ...

  4. SQL SERVER级联查询及数据结构《存储过程-递归树形查询》

    --创建表,插入数据 create table tb(id varchar(3) , pid varchar(3) , name varchar(10))insert into tb values(' ...

  5. 理解Task和和async await

    本文将详解C#类当中的Task,以及异步函数async await和Task的关系 一.Task的前世今生 1.Thread 一开始我们需要创建线程的时候一般是通过Thread创建线程,一般常用创建线 ...

  6. SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂)

    SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂) 1.SpringBoot整合Druid Druid是阿里巴巴的一个开源项目,是一个数据库连接池的实现,结合了C3P0. ...

  7. 矩阵连乘问题的算法复杂度的计算--卡塔兰数(Catalan数)的数学推导和近似公式

    author: cust-- ZKe --------------------- 这里以连乘积加括号问题为背景: 由于矩阵的乘积满足结合律,且矩阵乘积必须满足左边矩阵的列数的等于右边矩阵的行数,不同的 ...

  8. JS--遍历对象属性的五种方式

    ES6 一共有 5 种方法可以遍历对象的属性. (1)for...in for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性). (2)Object.keys(obj) Ob ...

  9. 【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境

    介绍 https://minikube.sigs.k8s.io/docs/ Minikube 用于快速在本地搭建 Kubernetes 单节点集群环境,它对硬件资源没有太高的要求,方便开发人员学习试用 ...

  10. layui的laypage实现分页/查询

    最开始我的数据绑定使用的razor语法来绑定的 就像下面这样 @if (ViewBag.listBlog != null) { foreach (var item in ViewBag.listBlo ...