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,可以很容易的实现.首先建立好数组,将需要全排 ...
随机推荐
- 「CF521D」Shop
传送门 Luogu 解题思路 当只有第三类操作时,我们显然先进行val较大的操作,这是显然的. 那么就考虑把所有的操作都转变为第三类操作. 第一类操作,显然很容易变为第二类操作:单点维护最大的最终结果 ...
- Flask与Django哪个更好更实用呢?砖家是这么认为的
这一周我打算做一个 Flask 教程.本文先把 Flask 和 Django 做一个比对,因为我对这两个 Python Web 框架都有实际的开发经验.希望我可以帮助您选择学习哪个框架,因为学 ...
- 为什么mysql having的条件表达式可以直接使用select后的别名?
SQL语句的语法顺序: FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> UNION -&g ...
- Unity ShaderLab 学习笔记(一)
因为项目的问题,有个效果在iOS上面无法实现出来- 因为shader用的HardSurface的,在android上面跑起来没有问题- 以为在iOS上也不会有问题,但是悲剧啊,技能效果一片漆黑- 而且 ...
- JAVA虚拟机:内存回收策略及算法
java虚拟机中的程序计数器区.虚拟机栈区.本地方法栈区3个区域是随着线程的创建而创建,随着线程的结束而结束时,内存自然得到回收,所以这三个区域不需要过多考虑内存的回收问题. java虚拟机中的方法区 ...
- HDU 3065 病毒侵袭持续中 (模板题)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 51nod 1444:破坏道路 广度优先搜索
1444 破坏道路 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 取消关注 在某一个国家,那儿有n个城市,他们通过 ...
- Python实现的远程登录windows系统功能示例
https://www.jb51.net/article/142326.htm 重点是这几本书要好好读读!: 更多关于Python相关内容感兴趣的读者可查看本站专题:<Python进程与线程操作 ...
- SpringBoo#Mybatis多个数据源配置,Sqlite&Mysql
第一步:排除数据源的自动配置类: @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) 第二步:定义好两个数据源的 ...
- Hibernate(十)--spring整合hibernate
结构: Spring和Hibernate整合借助于HibernateTemplate applicationContext.xml <?xml version="1.0" e ...