题目描述

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

输出

请填写表示方案数目的整数。 
 
分析1
          使用开锁解锁机制、通过DFS一边搜索一边计数,每积累5个方格就停止进一步搜索,同时将结果存储起来。
   但是3、5、6、7、10(如图)此种情况是DFS做不到的,以下代码只用了DFS,只能得到82种结果。
 #include <iostream>
#include <vector>
#include <stdio.h>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
const int ROW = ;
const int COL = ;
int sum = ;
int num = ;
int dd[][] = {{,},{,},{,-},{-,}};
vector<vector<int> >a(ROW,vector<int>(COL,-));
vector<int>sig[];
vector<int>zz;
vector<int>temp;
void rightload(){
sig[sum] = temp;
}
bool checkrightload(){
temp = zz;
sort(temp.begin(),temp.end());
for(int i = ;i < sum;i++){
if(sig[i] == temp)
return false;
}
return true;
}
void lock(int i,int j){
num++;
a[i][j] = i*COL+j;
zz.push_back(a[i][j]);
}
void unlock(int i,int j){
num--;
a[i][j] = -;
zz.pop_back();
}
void dfs(int i,int j){
for(int zz = ;zz < ;zz++){
int ii = i + dd[zz][];
int jj = j + dd[zz][];
if(ii < ||jj < ||ii >= ROW||jj >= COL)
continue;
if(a[ii][jj] == -){
lock(ii,jj);
if(num == ){
if(checkrightload()){
rightload();
sum++;
}
}
else
dfs(ii,jj);
unlock(ii,jj);
}
}
}
int main(){
for(int i = ;i < ROW;i++){
for(int j = ;j < COL;j++){
lock(i,j);
dfs(i,j);
unlock(i,j);
}
}
for(int i = ;i < sum;i++){
for(int j = ;j < ;j++){
cout <<sig[i][j] <<" ";
}
cout <<endl;
}
cout << sum <<endl;
return ;
}

分析2

    为了弥补分析1所提出的漏洞,需要用BFS与DFS相结合,才能得到所有情况,以下是BFS与DFS结合解题的代码。

 #include <iostream>
#include <vector>
#include <stdio.h>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
const int ROW = ;
const int COL = ;
int sum = ;
int num = ;
int dd[][] = {{,},{,},{,-},{-,}};
vector<vector<int> >a(ROW,vector<int>(COL,-));
vector<int>sig[];
vector<int>zz;
vector<int>temp;
queue<pair<int,int> >myque;
void rightload(){
sig[sum] = temp;
}
bool checkrightload(){
temp = zz;
sort(temp.begin(),temp.end());
for(int i = ;i < sum;i++){
if(sig[i] == temp)
return false;
}
return true;
}
void lock(int i,int j){
num++;
a[i][j] = i*COL+j;
zz.push_back(a[i][j]);
}
void unlock(int i,int j){
num--;
a[i][j] = -;
zz.pop_back();
}
void bfs(int i,int j){
for(int zz = ;zz >= ;zz--){
int ii = i + dd[zz][];
int jj = j + dd[zz][];
if(ii < ||jj < ||ii >= ROW||jj >= COL)
continue;
if(a[ii][jj] == -){
myque.push({ii,jj});
}
}
while(!myque.empty()){
int ii = myque.front().first;
int jj = myque.front().second;
myque.pop();
lock(ii,jj);
if(num == ){
if(checkrightload()){
rightload();
sum++;
}
}
else{
bfs(ii,jj);
}
unlock(ii,jj);
}
}
void dfs(int i,int j){
for(int zz = ;zz < ;zz++){
int ii = i + dd[zz][];
int jj = j + dd[zz][];
if(ii < ||jj < ||ii >= ROW||jj >= COL)
continue;
if(a[ii][jj] == -){
lock(ii,jj);
if(num == ){
if(checkrightload()){
rightload();
sum++;
}
}
else{
dfs(ii,jj);
}
bfs(i,j);
unlock(ii,jj);
}
}
}
int main(){
for(int i = ;i < ROW;i++){
for(int j = ;j < COL;j++){
lock(i,j);
dfs(i,j);
unlock(i,j);
}
}
for(int i = ;i < sum;i++){
for(int j = ;j < ;j++){
cout <<sig[i][j] <<" ";
}
cout <<endl;
}
cout << sum <<endl;
return ;
}

DFS+BFS(广度优先搜索弥补深度优先搜索遍历漏洞求合格条件总数)--09--DFS+BFS--蓝桥杯剪邮票的更多相关文章

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

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

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

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

  3. 蓝桥杯 剪邮票 DFS (不错的题目)

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

  4. DFS(深度优先搜索遍历求合格条件总数)--07--DFS--蓝桥杯方格填数

    此题方法多种,我用规范的DFS来求解 题目:方格填数 如下的10个格子,填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻)一共有多少种可能的填数方案?   输出 请填写表示 ...

  5. python实现广度优先搜索和深度优先搜索

    图的概念 图表示的是多点之间的连接关系,由节点和边组成.类型分为有向图,无向图,加权图等,任何问题只要能抽象为图,那么就可以应用相应的图算法. 用字典来表示图 这里我们以有向图举例,有向图的邻居节点是 ...

  6. 总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较

    广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时, ...

  7. DFS(一):深度优先搜索的基本思想

    采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点.不同的问题需要用不同的数据结构描述. 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新 ...

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

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

  9. 《算法笔记》8.1小节——搜索专题->深度优先搜索(DFS)

    http://codeup.cn/contest.php 5972 这是递归的入门题,求全排列,第一种方法用STL中的函数next_permutation,可以很容易的实现.首先建立好数组,将需要全排 ...

随机推荐

  1. 「SP1043」GSS1 - Can you answer these queries I

    传送门 Luogu 解题思路 这题就是 GSS3 的一个退化版,不带修改操作的区间最大子段和,没什么好讲的. 细节注意事项 咕咕咕 参考代码 #include <algorithm> #i ...

  2. Time Series_1_BRKA Case

    Berkshire Hathaway (The most expensive stock ever in the world) 1.1 Download data require(quantmod) ...

  3. 105、Java中String类之利用indexOf()方法判断子字符串是否存在

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  4. texlive 安装

    texlive 可以从下面两个网址下载 https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/ https://mirror ...

  5. [DllImport("kernel32.dll")]

    这叫引入kernel32.dll这个动态连接库. 这个动态连接库里面包含了很多WindowsAPI函数,如果你想使用这面的函数,就需要这么引入.举个例子: [DllImport("kerne ...

  6. 从ofo到乐视,变卖资产好过冬靠谱吗?

    今年年底,有很多人"被迫"离职.他们为了应对生活压力和找工作的不确定性,尝试在二手平台上卖出自己的奢侈品或心爱之物,以期度过潜在的难关.而对于很多企业来说,这个冬天也非常冷.依靠常 ...

  7. idea2018破解到2099年

    破解的详细过程: 1.从下面地址下载一个jar包,名称是 JetbrainsCrack-3.1-release-enc.jar 下载地址链接: https://pan.baidu.com/s/1WU5 ...

  8. 使用线程池测试cpu的并发计算能力

    接到一个需求是测试一下cpu并发计算能力,针对int和float求和单位时间能执行几次的问题.可能是服务器选型用到的参数. 开始使用的是fork-join,但是发现fork-join每次得到的结果值波 ...

  9. 我的C语言的新开端<graphics.h>

    进一步接触C语言<graphics.h> #include<stdio.h> #include<graphics.h> #include<conio.h> ...

  10. u盘使用记录、痕迹删除技巧方法

    在日常生活的使用U盘过程当中,系统会记录下大量U盘的使用记录信息,那么接下来小编就来同大家分享介绍如何删除掉这些使用记录的方法知识. 1. 往系统里面添加环境变量devmgr_shownonprese ...