剪邮票

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

请你计算,一共有多少种不同的剪取方法。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std; const int maxn = ;
int maze[][];
int num[];
int have[]; // 用了对从全排列中 选出来 5个数 ,进行 标志 (回溯: 标志为true后,需要换回false)
bool used[][]; //这个是 从全排列中选出来5个数,进行DFS搜索是否连续用的标志数组 , 标志为true后,不需要换回false
bool visit[]; //进行全排列用的标志数组
int ans;
int Count = ;
int dir[][] = {{-, }, {, }, {, }, {, -}}; //方向 void init();
void dfs_find(int r, int c);
bool judge(int r, int c);
void solve(); void init()
{
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
maze[i][j] = i* + j + ;
}
}
} bool judge(int r, int c)
{
return (r >= && r < ) && (c >= && c < );
} void dfs_find(int r, int c)
{
for (int i = ; i < ; i++)
{
int nx = r + dir[i][], ny = c + dir[i][];
//这个位置不是have标记位置(have里标记过的元素,是全排列找到的五个元素),或者已经访问过了
if (judge(nx, ny) && !used[nx][ny] && have[maze[nx][ny]]) {
used[nx][ny] = true; //不需要换回 false, 除非出现另外一组5个数的时候
Count++; //连续的数++
dfs_find(nx, ny); //对一个点进行DFS
}
}
} void solve()
{
memset(have, , sizeof(have));
memset(used, false, sizeof(used));
for (int i = ; i <= ; i++) {
have[ num[i] ] = ; //对5个数的位置进行标记
} for (int i = ; i < ; i++)
{
int r = i / ; //对应行
int c = i % ; //对应列
if ( have[maze[r][c]] ) // 对找到的 5个数字(被标记1的),开始DFS搜索
{
Count = ; //开始为1
used[r][c] = true; //由标记的第一个数开始, 向其他标记的数 进行DFS, 找到则 Count++
dfs_find(r, c);
break;
}
}
if (Count == ) { //全排列找到的5个数, 是相邻的, 则ans++
ans++;
}
}
//创建5个数的组合
void Start_DFS(int cur)
{
if (cur == ) //找到了5个数
{
solve(); //对找到的5个数,进行排列组合
return;
} //1到12 这 12个数 挨个遍历 -- 并进行DFS搜索
for (int i = num[cur - ] + ; i < ; i++)
{
if (!visit[i])
{
visit[i] = true;
num[cur] = i; //存数, 对12个数进行全排列,从中选5个数,再进行排列组合
Start_DFS(cur + ); //下一个数
visit[i] = false;
}
}
} int main()
{
init();
Start_DFS();
printf("%d\n", ans);
}

算法思路:

1. 先全排列,从全排列1~12,从中选5个数,进行排列组合;

2. 对选中的5个数标志;

3. 循环找到第一个 第一个被标志的位置,并DFS递归寻找,他的dir方向的数字,是否是从全排列中选出来的其他数字.

详细看注释.

参考了这篇博客:http://blog.csdn.net/wuxiushu/article/details/51207533

蓝桥杯 剪邮票 DFS (不错的题目)的更多相关文章

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

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

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

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

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

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

  4. 蓝桥杯——剪邮票(2016JavaB组第10题)

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

  5. 蓝桥杯---剪格子(DFS&BFS)(小总结)

    问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+ ...

  6. 蓝桥杯剪格子dfs

    #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #incl ...

  7. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...

  8. 2018年蓝桥杯A组C/C++决赛题目

    2018年蓝桥杯A组C/C++决赛题目 2018年蓝桥杯A组C/C++决赛题解     1:三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5 ...

  9. 2016年蓝桥杯B组C/C++决赛题目

    2016年第七届蓝桥杯B组C/C++决赛题目 点击查看2016年第七届蓝桥杯B组C/C++决赛题解 1.一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的 ...

随机推荐

  1. Week-4-作业1

    前言 经过了上周作业的学习拾遗,让我学到了很多东西,也能更好的阅读<构建之法>这本书,下面是我在阅读过第四章和第十七章之后想到的一些问题. 第四章 4.2.1 关于缩进,书中说用四个空格刚 ...

  2. tomcat文件中server.xml 实例说明

    <?xml version='1.0' encoding='utf-8'?>   # 这是server类, 指定一个tomcat的应用实例 <Server port="80 ...

  3. 关于idea使用快捷键复制一行代码,屏幕倒置处理办法

    在idea里面设置使用eclipse的Keymap键盘布局,复制一行代码的快捷键是[ctrl+alt+down],但是在使用后发现屏幕倒置了,原因是该快捷键和显卡快捷键冲突了,处理办法如下图,关闭显卡 ...

  4. 10条SQL优化语句,让你的MySQL数据库跑得更快!

    慢SQL消耗了70%~90%的数据库CPU资源: SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低: SQL语句可以有不同的写法: 1 不使用子 ...

  5. 增加kms计数

    @echo offset skms=10.15.68.62for %%i in (. . . . . . . . . . . . . . . . . . . . . . . . . .) do cal ...

  6. 检查cpu是否支持VT-X(HAXM)

    可以使用CPU-Z进行检测,CPU是否支持VT-X,如果不支持,就不要浪费时间安装HAXM了. 可以试一下Genymotion模拟器.

  7. find K maximum value from an unsorted array(implement min heap)

    Maintain a min-heap with size = k, to collect the result. //Find K minimum values from an unsorted a ...

  8. git gitosis 添加项目

    example: 1, user@my-test:~/perl_src$ git inituser@my-test:~/perl_src$ git add .user@my-test:~/perl_s ...

  9. 基本数据结构 —— 堆以及堆排序(C++实现)

    目录 什么是堆 堆的存储 堆的操作 结构体定义 判断是否为空 往堆中插入元素 从堆中删除元素 取出堆中最大的元素 堆排序 测试代码 例题 参考资料 什么是堆 堆(英语:heap)是计算机科学中一类特殊 ...

  10. Fork/Join框架实现原理

    ForkJoinPool由ForkJoinTask数组和ForkJoinWorkerThread数组组成,ForkJoinTask数组负责存放程序提交给ForkJoinPool的任务,而ForkJoi ...