蓝桥杯2020 E:七段码

题解
正规解法是 dfs + 并查集,首先用 dfs 将其所有的情况枚举出来,再用并查集来判断是否在一个连通块上。
许多小伙伴计算的答案为76,主要是判断连通块这方面有问题,倘若不用并查集,直接枚举一条边是否和其余剩下的边相连,是就成立,不是就可以直接退出了,但是有一个问题是例如两个连通块的时候你上述的判断也是成立的,但是不处于同一个连通块中,所以不应该加上去。
1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4
5 const int MAXN = 25;
6 int n = 7, ans = 0, path[MAXN], f[MAXN][MAXN], father[MAXN];
7
8 //查找 x 的祖先节点
9 int find(int x)
10 {
11 if (x != father[x]) { //路径压缩
12 return father[x] = find(father[x]);
13 }
14 return father[x];
15 }
16
17 void dfs(int u, int p, int m)
18 {
19 if (u == m) {
20 //初始化操作
21 for (int i = 1; i < MAXN; ++i) {
22 father[i] = i;
23 }
24 //集合合并
25 for (int i = 0; i < m; ++i) {
26 for (int j = i + 1; j < m; ++j) {
27 //存在边相连
28 if (f[path[i]][path[j]] == 1) {
29 //path[i] 和 path[j] 合并成一个集合
30 father[find(path[i])] = find(father[path[j]]);
31 }
32 }
33 }
34 //查找最终是否为一个集合
35 bool flag = false;
36 for (int i = 0; i < m - 1; ++i) {
37 if (find(path[i]) != find(path[i + 1])) {
38 flag = true;
39 break;
40 }
41 }
42
43 if (!flag) {
44 ++ans;
45 }
46 return ;
47 }
48 for (int i = p; i <= n; ++i) {
49 path[u] = i;
50 dfs(u + 1, i + 1, m);
51 }
52 }
53
54 int main()
55 {
56 memset(f, 0, sizeof(f));
57 f[1][2] = f[2][1] = 1;
58 f[1][6] = f[6][1] = 1;
59 f[2][7] = f[7][2] = 1;
60 f[6][7] = f[7][6] = 1;
61 f[7][3] = f[3][7] = 1;
62 f[7][5] = f[5][7] = 1;
63 f[2][3] = f[3][2] = 1;
64 f[3][4] = f[4][3] = 1;
65 f[4][5] = f[5][4] = 1;
66 f[5][6] = f[6][5] = 1;
67 for (int i = 1; i <= n; ++i) {
68 dfs(0, 1, i);
69 }
70 cout << ans << endl;
71 return 0;
72 }
但是当时还是没有做出来/(ㄒoㄒ)/~~哭鼻子。
蓝桥杯2020 E:七段码的更多相关文章
- 蓝桥杯2020.10.17B组c++
1.门牌制作 暴力即可 #include <iostream> #include<math.h> #include<string.h> #include<st ...
- 2020第十一届蓝桥杯第二场省赛C++A组【A-H】
A. 门牌制作 答案 624 代码 #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_st ...
- 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案
2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...
- 第四届蓝桥杯 c/c++真题
第四届蓝桥杯 c/c++真题 <1>高斯日记 问题 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们 ...
- 第三届蓝桥杯 c/c++真题
第三届蓝桥杯真题 c/c++ 以下题目我自己也并不是所有的题目都是一次性就能做对或是有结题思路的.有些题目也是经过查证网上相关的资料或是参考了别人的代码和解题思路才做出来的.总的来看,这份题目考了很多 ...
- 【蓝桥杯单片机02】LED的基本控制
[蓝桥杯单片机02]LED的基本控制 广东职业技术学院 欧浩源 在CT107D单片机综合训练平台实现LED的基本控制和其他单片机开发平台不一样,不单单是控制几个LED实现跑马灯这么简单.因为在这个平 ...
- 蓝桥杯java历年真题及答案整理1~20.md
蓝桥杯java历年真题及答案整理(闭关一个月,呕心沥血整理出来的) 1 算法是这样的,如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种.如:给定 A.B.C三个不同的字符,则结果为:A ...
- 2018年第九届蓝桥杯题目(C/C++B组)汇总
第一题 标题:第几天 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容. 解题思路: 1. 判断2月有几天, ...
- 2017第八届蓝桥杯C/C++语言A组
一:题目: 标题:迷宫 X星球的一处迷宫游乐场建在某个小山坡上.它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R ...
随机推荐
- TS数据类型:类型别名/联合类型/字面量类型/类型推论等纲要
在学C/C++ Java等强类型语言时,变量类型是唯一的,需要先指定.PHP JavaScript等弱类型语言时,无需指定变量类型 但是,TypeScript里面的联合类型 (Union Type) ...
- RXJAVA之聚合操作
concat 按顺序连接多个Observables.需要注意的是Observable.concat(a,b)等价于a.concatWith(b). startWith 在数据序列的开头增加一项数据.s ...
- 搜索引擎学习(五)Lucene操作索引
一.代码分析 /** * Lucene入门 * 操作索引 */ public class ManageIndex { public IndexWriter getIndexWriter() throw ...
- php bypass disable function
前言 最近开学,事太多了,好久没更新了,然后稍微闲一点一直在弄这个php bypass disable function,一开始自己的电脑win10安装蚁剑的插件,一直报错.怀疑是必须linux环境. ...
- awk的一些认识
awk awk '{pattern + action}' {filenames} 当我们所指定的规则脚本过长的时候,我们可以使用-f的选项加上我们的脚本文件.再复杂点我们可以直接调用shell脚本,就 ...
- 一文了解Zookeeper
Zookeeper是Apache开源的一个分布式框架,它主要为分布式应用提供协调服务. Zookeeper主要负责存储和管理大家都关心的数据,一旦这些数据的状态发生变化,Zookeeper就会通知那些 ...
- 用Docker swarm快速部署Nebula Graph集群
用Docker swarm快速部署Nebula Graph集群 一.前言 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群. 二.nebula集群搭建 2.1 环境准 ...
- 使用Flutter完成10个商业项目后的经验教训
作者:Łukasz Kosman 和 Jakub Wojtczak 原文:https://medium.com/swlh/lessons-learned-after-making-the-first- ...
- Harmony OS 开发避坑指南——DevEco Device Tool 安装配置
Harmony OS 开发指南--DevEco Device Tool 安装配置 本文介绍如何在Windows主机上安装DevEco Device Tool工具. 坑点总结: 国内部分网络环境下,安装 ...
- 【extern】【static】
C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期间分配固定的存储空间的方式.静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量. 动态存 ...