剪邮票

如图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)相关推荐

  1. 蓝桥杯.剪邮票(DFS)

    Question: Result:  116 Solve: 这个题意还是比较好懂的,就是12个数里找出5个数,然后看这5个数在方格中的位置是否相连, 代码也是这个思路,但确实不太好写,我换了好几种方案 ...

  2. 第七届蓝桥杯-剪邮票(深搜+广搜)

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

  3. [蓝桥杯] 剪邮票 (Python 实现)

    题目: 代码: import itertools count=0 a=[1,2,3,4,6,7,8,9,11,12,13,14] b=list(itertools.combinations(a,5)) ...

  4. 九宫重排 蓝桥杯c++ 题解 字符串hash+bfs

    九宫重排 蓝桥杯c++ 题解 字符串hash+bfs 题意:给出一个九宫格,你可以将与空格相邻的数字和空格进行交换,目的是得到另一个九宫格,问最少的步数. 思路:从最小步数不难看出我们可以使用广度优先 ...

  5. 蓝桥杯-迷宫(DFS)

    蓝桥杯-迷宫(DFS) 题目描述 X 星球的一处迷宫游乐场建在某个小山坡上.它是由 10 \times 1010×10 相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡 ...

  6. java蓝桥杯省赛第十届_2019年第十届蓝桥杯省赛-迷宫(BFS/Excel大法)

    这题用dfs搜不出来,需要使用bfs并记录路径,设置好方向顺序跑就ok 然而毕竟是暴力杯,我们的原则是代码能省就省(懒癌晚期 于是乎网上便出现了形形色色的题解,笔者综合了各路大神神乎其技的思想,总结出 ...

  7. 2022蓝桥杯学习——6.双指针、BFS和图论

    一.双指针 关于双指针 核心思想就是优化!! 双指针只用一层循环,虽然里面是while,但j只执行了n次,所以ij一共就是2n,时间复杂度就是O(n) , 这种题一般先写出暴力算法,然后看单调性,如果 ...

  8. 蓝桥杯 排列数(DFS搜索)

    算法提高 排列数   时间限制:1.0s   内存限制:256.0MB      问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...

  9. 蓝桥杯笔记:DFS(深度优先搜索)解决问题

    DFS: 深度优先搜索: 访问当前的元素后,递归访问元素的邻接元素(找出所有下一步的可能元素,判断是否能访问),撤回当前元素访问 dfs(当前状态) {//递归终止条件if(当前状态==结束状态) { ...

  10. java实现第四届蓝桥杯剪格子

    剪格子 题目描述 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子 ...

最新文章

  1. 要在 create-react-app 脚手架里使用 less 的方法
  2. empress和queen区别_queen与empress
  3. 查理芒格+终身学习+你的认知就是你的财富的边界
  4. [Spring 深度解析]第3章 核心容器
  5. c# Parallel.For 并行编程 执行顺序测试
  6. hdfs合并块_hdfs 小文件合并 问题
  7. Kubernetes里的secret最基本的用法
  8. 解决ckeditor富文本在layui 弹框中大小字体等下拉不显示
  9. C++ Handle(句柄) part1
  10. excel处置4000行数据卡_懂Excel就能轻松入门Python数据分析包pandas(三):制作成绩条...
  11. java代码继承------多层继承
  12. 华为摄像头搜索软件_华为Mate 40 Pro评测:硬件和软件表现都近乎完美
  13. loj#6433. 「PKUSC2018」最大前缀和(状压dp)
  14. linux 中select()函数的使用
  15. JDK的KeyTool和KeyStore等加密相关
  16. SQL server学习
  17. 排队论模型(三):M / M / s/ s 损失制排队模型
  18. RPL源路由的IPv6路由头[RFC6554译文]
  19. 织梦(dedecms)标签大全(非常全面)
  20. 核酸多样性(pi)计算公式

热门文章

  1. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_5_InvalidClassException异常_原理...
  2. monitor out
  3. HDU 5025 Saving Tang Monk【bfs搜索】【北大ACM/ICPC竞赛训练】
  4. HAproxy的安装配置及动静分离
  5. Windows Server 2003下ASP.NET无法识别IE11的解决方法【转】
  6. php使用RabbitMQ
  7. LOJ6031 「雅礼集训 2017 Day1」字符串 SAM、根号分治
  8. wordpress页面前端添加编辑按钮
  9. mysql数据库表格导出为excel表格
  10. Data Warehouse