蓝桥杯 剪邮票(dfs枚举 + bfs)
剪邮票
如图1, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,图2,图3中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
图1 图2 图3
思路:1、首先从12数中选出5个数(求其所有组合数) 用dfs(保证五个数是递增的,避免重复) ,存入一维数组a中
2、将a中的这五个数转化为二维坐标形式,然后将其在地图上置1(将vis置1),再用bfs判断地图上这5个置1的数是否相连
1 #include<iostream> 2 #include<algorithm> 3 #include<queue> 4 #include<cstring> 5 6 using namespace std; 7 8 int a[100]; 9 int vis[4][5]; //下标为0的不用 10 int dx[] = { 1,-1,0,0 }; 11 int dy[] = { 0,0,1,-1 }; 12 13 int result = 0; 14 15 struct node 16 { 17 int x, y; 18 }s; 19 20 void bfs(int a[]) 21 { 22 memset(vis, 0, sizeof(vis)); //记得将vis置零,防止有残余的1 23 int x, y; 24 25 //把一维下标转换为二维坐标 26 for (int i = 1; i <= 5; ++i) 27 { 28 if (a[i] % 4 == 0) 29 { 30 x = a[i] / 4; 31 y = 4; 32 } 33 else 34 { 35 x = a[i] / 4 + 1; 36 y = a[i] % 4; 37 } 38 vis[x][y] = 1; 39 } 40 41 s.x = x; 42 s.y = y; 43 44 queue<node>Q; 45 Q.push(s); 46 vis[s.x][s.y] = 0; 47 int num = 1; 48 49 node t; 50 while (!Q.empty()) 51 { 52 t = Q.front(); 53 Q.pop(); 54 55 for (int i = 0; i < 4; ++i) 56 { 57 int xx = t.x + dx[i]; 58 int yy = t.y + dy[i]; 59 if (xx >= 1 && xx <= 3 && yy >= 1 && yy <= 4 && vis[xx][yy] == 1) 60 { 61 ++num; //每有一个相连,num就自增 62 vis[xx][yy] = 0; 63 s.x = xx; 64 s.y = yy; 65 Q.push(s); 66 } 67 } 68 } 69 70 if (num == 5) //如果这5个数都相连 71 { 72 ++result; 73 } 74 75 } 76 77 void dfs(int step) //从12个数中取出5个(即12取5的所有组合),存入一维数组a中(从下标1开始存储) 78 { 79 if (step == 6) 80 { 81 bfs(a); //用bfs判断取出的这5个数在图中是否相连 82 return; 83 } 84 85 for (int i = 1; i <= 12; ++i) 86 { 87 if (i > a[step - 1]) //以递增的顺序选出,可以防止重复 88 { 89 a[step] = i; 90 dfs(step + 1); 91 } 92 } 93 94 95 } 96 97 int main() 98 { 99 memset(a, 0, sizeof(a)); 100 dfs(1); 101 cout << result << endl; 102 103 return 0; 104 }
转载于:https://www.cnblogs.com/FengZeng666/p/10496223.html
蓝桥杯 剪邮票(dfs枚举 + bfs)相关推荐
- 蓝桥杯.剪邮票(DFS)
Question: Result: 116 Solve: 这个题意还是比较好懂的,就是12个数里找出5个数,然后看这5个数在方格中的位置是否相连, 代码也是这个思路,但确实不太好写,我换了好几种方案 ...
- 第七届蓝桥杯-剪邮票(深搜+广搜)
剪邮票 如下图, 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连)比如,下面两个图中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不 ...
- [蓝桥杯] 剪邮票 (Python 实现)
题目: 代码: import itertools count=0 a=[1,2,3,4,6,7,8,9,11,12,13,14] b=list(itertools.combinations(a,5)) ...
- 九宫重排 蓝桥杯c++ 题解 字符串hash+bfs
九宫重排 蓝桥杯c++ 题解 字符串hash+bfs 题意:给出一个九宫格,你可以将与空格相邻的数字和空格进行交换,目的是得到另一个九宫格,问最少的步数. 思路:从最小步数不难看出我们可以使用广度优先 ...
- 蓝桥杯-迷宫(DFS)
蓝桥杯-迷宫(DFS) 题目描述 X 星球的一处迷宫游乐场建在某个小山坡上.它是由 10 \times 1010×10 相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡 ...
- java蓝桥杯省赛第十届_2019年第十届蓝桥杯省赛-迷宫(BFS/Excel大法)
这题用dfs搜不出来,需要使用bfs并记录路径,设置好方向顺序跑就ok 然而毕竟是暴力杯,我们的原则是代码能省就省(懒癌晚期 于是乎网上便出现了形形色色的题解,笔者综合了各路大神神乎其技的思想,总结出 ...
- 2022蓝桥杯学习——6.双指针、BFS和图论
一.双指针 关于双指针 核心思想就是优化!! 双指针只用一层循环,虽然里面是while,但j只执行了n次,所以ij一共就是2n,时间复杂度就是O(n) , 这种题一般先写出暴力算法,然后看单调性,如果 ...
- 蓝桥杯 排列数(DFS搜索)
算法提高 排列数 时间限制:1.0s 内存限制:256.0MB 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...
- 蓝桥杯笔记:DFS(深度优先搜索)解决问题
DFS: 深度优先搜索: 访问当前的元素后,递归访问元素的邻接元素(找出所有下一步的可能元素,判断是否能访问),撤回当前元素访问 dfs(当前状态) {//递归终止条件if(当前状态==结束状态) { ...
- java实现第四届蓝桥杯剪格子
剪格子 题目描述 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子 ...
最新文章
- 要在 create-react-app 脚手架里使用 less 的方法
- empress和queen区别_queen与empress
- 查理芒格+终身学习+你的认知就是你的财富的边界
- [Spring 深度解析]第3章 核心容器
- c# Parallel.For 并行编程 执行顺序测试
- hdfs合并块_hdfs 小文件合并 问题
- Kubernetes里的secret最基本的用法
- 解决ckeditor富文本在layui 弹框中大小字体等下拉不显示
- C++ Handle(句柄) part1
- excel处置4000行数据卡_懂Excel就能轻松入门Python数据分析包pandas(三):制作成绩条...
- java代码继承------多层继承
- 华为摄像头搜索软件_华为Mate 40 Pro评测:硬件和软件表现都近乎完美
- loj#6433. 「PKUSC2018」最大前缀和(状压dp)
- linux 中select()函数的使用
- JDK的KeyTool和KeyStore等加密相关
- SQL server学习
- 排队论模型(三):M / M / s/ s 损失制排队模型
- RPL源路由的IPv6路由头[RFC6554译文]
- 织梦(dedecms)标签大全(非常全面)
- 核酸多样性(pi)计算公式
热门文章
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_5_InvalidClassException异常_原理...
- monitor out
- HDU 5025 Saving Tang Monk【bfs搜索】【北大ACM/ICPC竞赛训练】
- HAproxy的安装配置及动静分离
- Windows Server 2003下ASP.NET无法识别IE11的解决方法【转】
- php使用RabbitMQ
- LOJ6031 「雅礼集训 2017 Day1」字符串 SAM、根号分治
- wordpress页面前端添加编辑按钮
- mysql数据库表格导出为excel表格
- Data Warehouse