蓝桥杯 剪邮票 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星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的 ...
随机推荐
- Android笔记-3-EditText的属性介绍
[Android 基础]EditText的属性介绍 EditText继承TextView,所以EditText具有TextView的属性特点,下面主要介绍一些EditText的特有的输入法的属性特点 ...
- bug排查
有时候让朋友,或者群友,或者同事帮忙看一样困扰你很久的bug会得到意向不到的结果. 因为他们往往不像你,已经在调试代码的过程中被一些东西给束缚了.他们会凭借自己的第一直觉来尝试解决问题,跳过你已经走的 ...
- 操作系统 cmd mini OS
#include <stdio.h>#include <stdlib.h>#include <string.h> void word(char *a){ if(st ...
- Eslint 配置及规则说明(报错)
https://blog.csdn.net/violetjack0808/article/details/72620859 https://blog.csdn.net/hsl0530hsl/artic ...
- Cocos2d入门及第一次运行时遇到的问题
先通过github下载cocos2d.これ:https://github.com/ZhouWeikuan/cocos2d 进入上面的网址后,如果不会用git或者svn的朋友就在页面的右下角点那个“Do ...
- Two Sum III - Data structure design
Design and implement a TwoSum class. It should support the following operations: add and find. add - ...
- 【大数据】Spark基础解析
第1章 Spark概述 1.1 什么是Spark 1.2 Spark内置模块 Spark Core:实现了Spark的基本功能,包含任务调度.内存管理.错误恢复.与存储系统交互等模块.Spark Co ...
- BZOJ3277 串(后缀数组+二分答案+主席树)
因为不会SAM,考虑SA.将所有串连起来并加分隔符,每次考虑计算以某个位置开始的子串有多少个合法. 对此首先二分答案,找到名次数组上的一个区间,那么只需要统计有多少个所给串在该区间内出现就可以了.这是 ...
- BZOJ3156 防御准备(动态规划+斜率优化)
设f[i]为在i放置守卫塔时1~i的最小花费.那么显然f[i]=min(f[j]+(i-j)*(i-j-1)/2)+a[i]. 显然这是个斜率优化入门题.将不与i.j同时相关的提出,得f[i]=min ...
- 【转】Latex编译报错后中断编译并改正,然后重复出现不明原因报错的解决方法
转自:https://www.douban.com/note/419828344/ 目录: 一.问题描述 二.测试情况(可以跳过,直接看建议) 三.建议 四.参考资料 正文: 问题描述: 错漏某个符号 ...