DFS+BFS(广度优先搜索弥补深度优先搜索遍历漏洞求合格条件总数)--09--DFS+BFS--蓝桥杯剪邮票
题目描述
比如,下面两张图中,粉红色所示部分就是合格的剪取。

请你计算,一共有多少种不同的剪取方法。
输出
#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--蓝桥杯剪邮票的更多相关文章
- 蓝桥杯 剪邮票(dfs枚举 + bfs)
剪邮票 如图1, 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,图2,图3中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的 ...
- 蓝桥杯 剪邮票 全排列+DFS
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...
- 蓝桥杯 剪邮票 DFS (不错的题目)
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的 ...
- DFS(深度优先搜索遍历求合格条件总数)--07--DFS--蓝桥杯方格填数
此题方法多种,我用规范的DFS来求解 题目:方格填数 如下的10个格子,填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻)一共有多少种可能的填数方案? 输出 请填写表示 ...
- python实现广度优先搜索和深度优先搜索
图的概念 图表示的是多点之间的连接关系,由节点和边组成.类型分为有向图,无向图,加权图等,任何问题只要能抽象为图,那么就可以应用相应的图算法. 用字典来表示图 这里我们以有向图举例,有向图的邻居节点是 ...
- 总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较
广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时, ...
- DFS(一):深度优先搜索的基本思想
采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点.不同的问题需要用不同的数据结构描述. 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新 ...
- 蓝桥杯---剪格子(DFS&BFS)(小总结)
问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+ ...
- 《算法笔记》8.1小节——搜索专题->深度优先搜索(DFS)
http://codeup.cn/contest.php 5972 这是递归的入门题,求全排列,第一种方法用STL中的函数next_permutation,可以很容易的实现.首先建立好数组,将需要全排 ...
随机推荐
- Java中的输入"scanf",Scanner用法
1.输入程序 1)Scnner的初始用法: 1 import java.util.Scanner; 2 public class Textone { 3 public static void main ...
- JavaNIO第一话-Buffer
Buffer是入门Java NIO的基础,本文希望通过一些形象的比喻来解释一下缓冲区的概念,帮助读者快速理解和记忆. 本文灵感来自于Bilibili博主v若水若水分享的尚硅谷Java视频_NIO视频教 ...
- POI 2001 Goldmine 线段树 扫描线
题目链接 http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1350 http://main.edu.pl/en/archive/oi/8/kop ...
- k-近邻算法原理入门-机器学习
//2019.08.01下午机器学习算法1——k近邻算法1.k近邻算法是学习机器学习算法最为经典和简单的算法,它是机器学习算法入门最好的算法之一,可以非常好并且快速地理解机器学习的算法的框架与应用.2 ...
- 线程高级篇-Lock锁实现生产者-消费者模型
Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...
- 初级入门 --- 认识 WebGL
WebGL 是什么? WebGL 是一组基于 JavaScript 语言的图形规范,浏览器厂商按照这组规范进行实现,为 Web 开发者提供一套3D图形相关的 API. 这些 API 能够让 Web 开 ...
- ubuntu 系统分配固定 ip--
由于Ubuntu重启之后,ip很容易改变,可以用以下方式固定ip地址 1.设置ip地址 vi /etc/network/interface # The loopback network interfa ...
- PYTHON __main__
#importby.py if __name__ =='__main__': print '>>>>>>>1' if __name__ =="imp ...
- 设备树DTS 学习:1-有关概念
背景 设备树在Linux驱动开发中是一种比较常用的架构. 参考:<设备树DTS使用总结> .<linux内核设备树及编译> Linux设备树 介绍 在Linux 2.6中,ar ...
- node批量修改文件名称
let fs = require('fs');//引用文件系统模块 let PATH = `./app_zijietiaodong/`;//当前文件夹 let ext = { readFileList ...