剪邮票

如【图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. java对文件的操作

    1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile {     /**      * 以字节为单位读取文件,常用 ...

  2. opencv的安装和卸载

    安装 测试环境为centos 安装依赖 yum install cmake gcc gcc-c++ gtk2-devel gimp-develgimp-devel-tools gimp-help-br ...

  3. Objective-C UIWebView添加脚视图

    - (void)addObserverForWebViewContentSize{ [self.webView.scrollView addObserver:self forKeyPath: cont ...

  4. 6th Alpha阶段的postmortem报告

    组名:好好学习(代组长发布)  会议重要内容记录: 1.  尝试在beta阶段实现的功能,与alpha阶段相比的优势 (1)更改软件现有的bug: 1)软件的账目只能输入,但是一旦发生失误却无法更改和 ...

  5. JAVA里的布尔运算符-甲骨文面试题

    重要一点: (& ,|) ==>二进制布尔运算符,(&&,||)==>条件布尔运算符 二进制布尔运算符,两边都会执行,不管左边是否为真或假==>对于运算符两边 ...

  6. 开源自己实现一个.net rpc框架 - Machete.Rpc

    Machete.Rpc Machete.Rpc 是一个轻量级的Rpc(远程过程调用的)框架.底层代理使用了Emit提高了效率,底层通信采用DotNetty框架以提升通信的效率.目前正在逐步完善中. G ...

  7. [POJ1704]Georgia and Bob 博弈论

    从这开始我们来进入做题环节!作为一个较为抽象的知识点,博弈论一定要结合题目才更显魅力.今天,我主要介绍一些经典的题目,重点是去理解模型的转化,sg函数的推理和证明.话不多说,现在开始! Georgia ...

  8. Luogu 2801 教主的魔法 | 分块模板题

    Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include < ...

  9. 第七周linux学习

    <Linux内核分析> 一.可执行程序是怎么得来的? 编译器预处理(负责把include的文件包含进来及宏替换等工作):编译成汇编代码:编译器编译成目标代码:再链接成可执行文件:操作系统加 ...

  10. CentOS7单节点部署redis主从复制和sentinel

    准备一台机器,系统版本为CentOS7. 部署redis 1.下载软件包 # wget http://download.redis.io/releases/redis-3.2.8.tar.gz 2.解 ...