题目描述

如下图, 有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. SSH框架系列:Spring读取配置文件以及获取Spring注入的Bean

    分类: [java]2013-12-09 16:29 1020人阅读 评论(0) 收藏 举报 1.简介 在SSH框架下,假设我们将配置文件放在项目的src/datasource.properties路 ...

  2. CTE With as 递归调用

    WITH AS的含义   WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会 被整个SQL语句所用到.有的时候,是为了 ...

  3. angularJs-服务调用与后台数据获取

    可以用factory做一些后台数据的获取,例如 happyFarm.factory('seedList',['$http',function($http){    return {        ge ...

  4. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:抽象类与接口的应用

    abstract class A{ // 定义抽象类A public abstract void print() ; // 定义抽象方法print() }; class B extends A { / ...

  5. 获取QQ群中的所有群友QQ

    package com.jm.mail.tools; import java.io.BufferedReader; import java.io.IOException; import java.io ...

  6. 使用 Helm【转】

    Helm 安装成功后,可执行 helm search 查看当前可安装的 chart. 这个列表很长,这里只截取了一部分.大家不禁会问,这些 chart 都是从哪里来的? 前面说过,Helm 可以像 a ...

  7. springboot2.1以javabean整合rabbitmq及自动注入rabbitmqTemplate为空问题

    springboot集成rabbitmq之前也写过,这次再来个总结,总体来讲比较简单 主要就是配置属性文件,将属性以javabean的形式注入,配置工厂,对象等原来以xml<bean>形式 ...

  8. Redis原理详解

    Redis原理详解 数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redi ...

  9. 标准C的标记化结构初始化语法

    1 struct file_operations { 2         struct module *owner; 3         loff_t (*llseek) (struct file * ...

  10. Codeforces1243C Tile Painting

    原题面:https://codeforces.com/contest/1243/problem/C 题目大意:给定数字n,有n个方块,第i个和第j个之间的距离(abs(i-j))如果是n的因子,那么第 ...