蓝桥杯 剪邮票 DFS (不错的题目)
剪邮票
如【图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 (不错的题目)的更多相关文章
- 蓝桥杯 剪邮票 全排列+DFS
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...
- 蓝桥杯 剪邮票(dfs枚举 + bfs)
剪邮票 如图1, 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,图2,图3中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的 ...
- java实现第七届蓝桥杯剪邮票
剪邮票 题目描述 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所 ...
- 蓝桥杯——剪邮票(2016JavaB组第10题)
剪邮票(16JavaB10) 如[图1], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2],[图3]中,粉红色所示部分就是合 ...
- 蓝桥杯---剪格子(DFS&BFS)(小总结)
问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+ ...
- 蓝桥杯剪格子dfs
#include<iostream> #include<cstring> #include<iomanip> #include<cmath> #incl ...
- 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案
2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...
- 2018年蓝桥杯A组C/C++决赛题目
2018年蓝桥杯A组C/C++决赛题目 2018年蓝桥杯A组C/C++决赛题解 1:三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5 ...
- 2016年蓝桥杯B组C/C++决赛题目
2016年第七届蓝桥杯B组C/C++决赛题目 点击查看2016年第七届蓝桥杯B组C/C++决赛题解 1.一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的 ...
随机推荐
- Week-4-作业1
前言 经过了上周作业的学习拾遗,让我学到了很多东西,也能更好的阅读<构建之法>这本书,下面是我在阅读过第四章和第十七章之后想到的一些问题. 第四章 4.2.1 关于缩进,书中说用四个空格刚 ...
- tomcat文件中server.xml 实例说明
<?xml version='1.0' encoding='utf-8'?> # 这是server类, 指定一个tomcat的应用实例 <Server port="80 ...
- 关于idea使用快捷键复制一行代码,屏幕倒置处理办法
在idea里面设置使用eclipse的Keymap键盘布局,复制一行代码的快捷键是[ctrl+alt+down],但是在使用后发现屏幕倒置了,原因是该快捷键和显卡快捷键冲突了,处理办法如下图,关闭显卡 ...
- 10条SQL优化语句,让你的MySQL数据库跑得更快!
慢SQL消耗了70%~90%的数据库CPU资源: SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低: SQL语句可以有不同的写法: 1 不使用子 ...
- 增加kms计数
@echo offset skms=10.15.68.62for %%i in (. . . . . . . . . . . . . . . . . . . . . . . . . .) do cal ...
- 检查cpu是否支持VT-X(HAXM)
可以使用CPU-Z进行检测,CPU是否支持VT-X,如果不支持,就不要浪费时间安装HAXM了. 可以试一下Genymotion模拟器.
- 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 ...
- git gitosis 添加项目
example: 1, user@my-test:~/perl_src$ git inituser@my-test:~/perl_src$ git add .user@my-test:~/perl_s ...
- 基本数据结构 —— 堆以及堆排序(C++实现)
目录 什么是堆 堆的存储 堆的操作 结构体定义 判断是否为空 往堆中插入元素 从堆中删除元素 取出堆中最大的元素 堆排序 测试代码 例题 参考资料 什么是堆 堆(英语:heap)是计算机科学中一类特殊 ...
- Fork/Join框架实现原理
ForkJoinPool由ForkJoinTask数组和ForkJoinWorkerThread数组组成,ForkJoinTask数组负责存放程序提交给ForkJoinPool的任务,而ForkJoi ...