【ACWing】1402. 星空之夜
题目地址:
https://www.acwing.com/problem/content/1404/
给定一个mmm行nnn列的二维0−10-10−1矩阵AAA,考虑所有的111的八连通块,要求将所有的形状相同的八连通块标记为相同的小写字母,并且使得输出矩阵的时候,矩阵字典序最小。两个连通块形状相同是指,旋转90°,180°,270°90\degree, 180\degree, 270\degree90°,180°,270°或者左右镜像翻转、上下镜像翻转之后能重合。
输入格式:
第一行包含一个整数,表示矩阵列数。第二行包含一个整数,表示矩阵行数。接下来mmm行,每行包含一个长度为nnn的010101序列,用来描述整个夜空矩阵。
输出格式:
输出标记完所有111连通块后的二维矩阵。用小写字母标记111连通块的方法很多,我们将整个输出读取为一个字符串,能够使得这个字符串字典序最小的标记方式,就是我们想要的标记方式。输出这个标记方式标出的最终二维矩阵。
数据范围:
0≤m,n≤1000\le m,n\le 1000≤m,n≤100
0≤s≤5000\le s\le 5000≤s≤500
0≤d≤260\le d\le 260≤d≤26
1≤t≤1601\le t\le 1601≤t≤160
sss为111连通块数量,ddd为不同的连通块数量,ttt是每个111连通块111的数量
思路是哈希。对于一个八连通块CCC,我们定义其哈希值为∑(x1,y1),(x2,y2)∈C,(x1,y1)≠(x2,y2)∣A[x1][y1]−A[x2][y2]∣2\sqrt{\sum_{(x_1,y_1),(x_2,y_2)\in C,(x_1,y_1)\ne (x_2,y_2)}|A[x_1][y_1]-A[x_2][y_2]|^2}(x1,y1),(x2,y2)∈C,(x1,y1)=(x2,y2)∑∣A[x1][y1]−A[x2][y2]∣2我们可以一行一行,每行从左到右遍历,通过DFS搜集每个111连通块的坐标,求得其哈希值,然后看一下这个哈希值是否出现过(这里哈希值是double类型的,不能直接用==
,而要做差看是否小于一个很小数),如果出现过就标记为之前给它配的那个记号,否则给它以新的标记,按照顺序标记为abcd...abcd...abcd...。代码如下:
#include <iostream>
#include <cmath>#define x first
#define y secondusing namespace std;typedef pair<int, int> PII;const int N = 110;
const double eps = 1e-6;int n, m;
char g[N][N];
PII q[N * N];double get_dist(PII a, PII b) {double dx = a.x - b.x, dy = a.y - b.y;return sqrt(dx * dx + dy * dy);
}// 算一下当前q数组里存的1连通块的哈希值
double get_hash(int size) {double sum = 0;for (int i = 0; i < size; i++)for (int j = i + 1; j < size; j++)sum += get_dist(q[i], q[j]);return sum;
}// 根据这个哈希值,返回其应该被标记为什么字母
char get_id(double key) {static double hash[30];static int id = 0;for (int i = 0; i < id; i++) // 如果该哈希值已存在,则返回之前给它配的那个字母if (fabs(hash[i] - key) < eps)return i + 'a';// 否则将该哈希值加入数组,并返回下一个还没使用的字母hash[id++] = key;return id - 1 + 'a';
}void dfs(int x, int y, int& size) {q[size++] = {x, y};g[x][y] = '0';for (int a = x - 1; a <= x + 1; a++) for (int b = y - 1; b <= y + 1; b++) {if (a == x && b == y) continue;if (0 <= a && a < m && 0 <= b && b < n && g[a][b] == '1')dfs(a, b, size);}
}int main() {cin >> n >> m;for (int i = 0; i < m; i++) cin >> g[i];for (int i = 0; i < m; i++)for (int j = 0; j < n; j++)if (g[i][j] == '1') {int size = 0;dfs(i, j, size);char c = get_id(get_hash(size));for (int k = 0; k < size; k++) g[q[k].x][q[k].y] = c;}for (int i = 0; i < m; i++) cout << g[i] << endl;return 0;
}
时空复杂度O(mn)O(mn)O(mn)。
【ACWing】1402. 星空之夜相关推荐
- AcWing 1402. 星空之夜 1月28
AcWing 1402. 星空之夜 1月28 题意: 一个星群是指一组非空的在水平,垂直或对角线方向相邻的星星的集合. 一个星群不能是一个更大星群的一部分. 星群可能是相似的. 如果两个星群的形状.包 ...
- 寒假每日一题(提高组)【Week 1 完结】
目录 1402. 星空之夜[dfs + 哈希] 479. 加分二叉树[DP] 1414. 牛异或[trie] 1402. 星空之夜[dfs + 哈希] https://www.acwing.com/p ...
- 华为让爱成双活动,缤纷好礼回馈消费者
2月2日,华为举办的"让爱成双"活动,不仅在服务APP推出互动小游戏.抖音平台小视频等众多新玩法.同时,华为商城和各大电商平台华为旗舰店还带来多重超值福利活动.即便消费者足不出户, ...
- html爱情表白神器,回忆纪念册(附源码)
文章目录 1.设计来源 1.1 主界面 1.2 相关界面 2.效果和源码 2.1 动态效果 2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/wei ...
- 2.14调情方案之个性情人节
他们说:"情人的眼里容不下沙子." 我们说:"情人的眼里只有彼此." 在2.14这样的日子,放下平日的矜持与羞涩,放松自己的心灵与肌体,来吧,和你的情人调调情, ...
- “机器人之夜”看猎豹跑得快还是五款机器人价格降得快?“鸿门宴”正式上演
来源:机器人大讲堂 3 月 21 日,猎豹移动(NYSE: CMCM)联合旗下人工智能公司猎户星空在北京水立方举行"猎豹3.21机器人之夜"发布会,发布自主研发的猎户机器人平台Or ...
- 用python画梵高星空-python 梵高
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 对于一个视频来说,只需要将每一帧都转换后输出,并按照一定的时间间隔清屏. ...
- 千灯照碧云,越夜越星沙
(题图摄影:邓建辉) 文 | 弘乐.陈曦 来源 | 螳螂财经(ID:TanglangFin) "晚上去红记吃小龙虾啊!"准备下班的李强拿着电话呼朋唤友.和他一起下楼的同事伍娟听到了 ...
- matlab模拟三体运动_从灯泡到超级计算机,如何模拟浩瀚星空?| 赛先生
天文学家中有这样一群人,他们既不观星,也不刷公式,而是通过模拟来研究浩瀚星空.在星团.星系这样的恒星系统中,往往包含着上百万颗恒星,规模如此惊人的恒星系统该如何处理?本期"赛先生天文&quo ...
- 4月24日云栖精选夜读 | 阿里云POLARDB如何助力轻松筹打造5亿用户信赖的大病筹款平台?...
[点击订阅云栖夜读周刊] 轻松筹首创了"大病救助"模式,帮助了众多病患在第一时间解決了医疗资金等问题,为了从源头解决了医疗资金问题.而在轻松筹这样全球5.5亿用户信赖的大病筹款平台 ...
最新文章
- Activity返回数据给上一个活动
- 利用gulp,当引入文件改动时,版本号自动更新~
- 蓝桥杯-2的次幂表示(java)
- 天梯赛 L1-027 出租 (20 分)
- 三百行python代码的项目_使用300行代码创建一个分布式系统
- java数组键_Java基础之数组
- C学习杂记(七)extern声明可省略变量类型
- 测试工具的选择和使用
- 【Java进阶营】Java多线程基础学习(一)
- UnityShader中的Queue
- 搜狗云输入法对外提供调用体验
- 会玩shiny的数据产品经理更好,是这样吗?
- 扬州工业机器人外壳设计排名_扬州模型达人设计机器人获奖
- 最美的时光在飞逝,为什么还在努力的路上蹒跚?
- oracle调优 oracle培训
- EM算法-硬币实验的理解
- C语言 static用法
- python编写程序计算三角形的面积_编程题:编写程序输入三角形的3条边长,计算并输出三角形的面积。...
- c语言 日志滚动 大小,Logrotate 日志滚动 解决日志占用空间过大
- 二十世纪的逻辑和哲学
热门文章
- Linux解决Device eth0 does not seem to be present,delaying initialization问题
- 面试题汇总11-20
- token验证失败 java_“Token校验失败,请检查确认”解决方法
- 海南大学考研经验之(考研英语)
- matlab中garchred是什么意思,garch模型matlab
- axio的请求异常响应统一处理
- vuex获取php数据,vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
- 岁月温柔-23 妈妈转到省医院第3天 突然icu有床位了
- 集合和数组区别_了解您的编码基础:集合和数组之间的主要区别
- 白话Android音频系统原理