剪邮票(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. CPU上下文

    CPU上下文 包括CPU寄存器和程序计数器(Program Counter,PC). CPU寄存器,是CPU内置的容量小.但速度极快的内存. 程序计数器,是用来存储CPU正在执行的指令位置.或者即将执 ...

  2. vue自定义指令长按事件

    Vue.directive('longpress', {     bind: function (el, binding, vNode) {         // Make sure expressi ...

  3. Redis常用命令(4)——List

    BLPOP 格式:BLPOP key [key ...] timeout 作用:从列表左侧弹出元素,超时时间为timeout,单位为秒.如果timeout为0则一直阻塞直到列表中有元素.如果同时操作多 ...

  4. Spring Cloud Alibaba 之Nacos

    Nacos 技术讲解 一提到分布式系统就不的不提一下 CAP 原则 什么是CAP CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability ...

  5. python开发基础(二)运算符以及数据类型之str(字符串)

    # encoding: utf-8 # module builtins # from (built-in) # by generator 1.147 """ Built- ...

  6. Docker(9)- docker pull 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 从镜像仓库中拉取或更新镜像 ...

  7. 利用sklearn实现k-means

    基于上面的一篇博客k-means利用sklearn实现k-means #!/usr/bin/env python # coding: utf-8 # In[1]: import numpy as np ...

  8. 第一次本地代码提交到github

    1.在个github上创建一个库 2.创建成功后,可以看到自己的仓库地址 3.在本地新建一个文件夹,并通过个git clone将仓库克隆到本地,并进入文件夹下 4.将需要提交的代码放入文件下,然后在终 ...

  9. CV 履历 格式

    CV 指的是 "Curriculum Vitae" Curriculum vitae 在拉丁语中的意思是"生命的故事" CV 经常被称为 "Resum ...

  10. linx 内核 并发与同步 1

    内核并发来源: 1.硬件中断和异常:中断服务程序和被中断的进程可能发生并发访问资源 2.软中断和tasklet,软中断和taklet随时都可能倍调度执行,从而打断当前正在执行 进程的上下文. 3.内核 ...