题目地址:

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. 星空之夜相关推荐

  1. AcWing 1402. 星空之夜 1月28

    AcWing 1402. 星空之夜 1月28 题意: 一个星群是指一组非空的在水平,垂直或对角线方向相邻的星星的集合. 一个星群不能是一个更大星群的一部分. 星群可能是相似的. 如果两个星群的形状.包 ...

  2. 寒假每日一题(提高组)【Week 1 完结】

    目录 1402. 星空之夜[dfs + 哈希] 479. 加分二叉树[DP] 1414. 牛异或[trie] 1402. 星空之夜[dfs + 哈希] https://www.acwing.com/p ...

  3. 华为让爱成双活动,缤纷好礼回馈消费者

    2月2日,华为举办的"让爱成双"活动,不仅在服务APP推出互动小游戏.抖音平台小视频等众多新玩法.同时,华为商城和各大电商平台华为旗舰店还带来多重超值福利活动.即便消费者足不出户, ...

  4. html爱情表白神器,回忆纪念册(附源码)

    文章目录 1.设计来源 1.1 主界面 1.2 相关界面 2.效果和源码 2.1 动态效果 2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/wei ...

  5. 2.14调情方案之个性情人节

    他们说:"情人的眼里容不下沙子." 我们说:"情人的眼里只有彼此." 在2.14这样的日子,放下平日的矜持与羞涩,放松自己的心灵与肌体,来吧,和你的情人调调情, ...

  6. “机器人之夜”看猎豹跑得快还是五款机器人价格降得快?“鸿门宴”正式上演

    来源:机器人大讲堂 3 月 21 日,猎豹移动(NYSE: CMCM)联合旗下人工智能公司猎户星空在北京水立方举行"猎豹3.21机器人之夜"发布会,发布自主研发的猎户机器人平台Or ...

  7. 用python画梵高星空-python 梵高

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 对于一个视频来说,只需要将每一帧都转换后输出,并按照一定的时间间隔清屏. ...

  8. 千灯照碧云,越夜越星沙

    (题图摄影:邓建辉) 文 | 弘乐.陈曦 来源 | 螳螂财经(ID:TanglangFin) "晚上去红记吃小龙虾啊!"准备下班的李强拿着电话呼朋唤友.和他一起下楼的同事伍娟听到了 ...

  9. matlab模拟三体运动_从灯泡到超级计算机,如何模拟浩瀚星空?| 赛先生

    天文学家中有这样一群人,他们既不观星,也不刷公式,而是通过模拟来研究浩瀚星空.在星团.星系这样的恒星系统中,往往包含着上百万颗恒星,规模如此惊人的恒星系统该如何处理?本期"赛先生天文&quo ...

  10. 4月24日云栖精选夜读 | 阿里云POLARDB如何助力轻松筹打造5亿用户信赖的大病筹款平台?...

    [点击订阅云栖夜读周刊] 轻松筹首创了"大病救助"模式,帮助了众多病患在第一时间解決了医疗资金等问题,为了从源头解决了医疗资金问题.而在轻松筹这样全球5.5亿用户信赖的大病筹款平台 ...

最新文章

  1. Activity返回数据给上一个活动
  2. 利用gulp,当引入文件改动时,版本号自动更新~
  3. 蓝桥杯-2的次幂表示(java)
  4. 天梯赛 L1-027 出租 (20 分)
  5. 三百行python代码的项目_使用300行代码创建一个分布式系统
  6. java数组键_Java基础之数组
  7. C学习杂记(七)extern声明可省略变量类型
  8. 测试工具的选择和使用
  9. 【Java进阶营】Java多线程基础学习(一)
  10. UnityShader中的Queue
  11. 搜狗云输入法对外提供调用体验
  12. 会玩shiny的数据产品经理更好,是这样吗?
  13. 扬州工业机器人外壳设计排名_扬州模型达人设计机器人获奖
  14. 最美的时光在飞逝,为什么还在努力的路上蹒跚?
  15. oracle调优 oracle培训
  16. EM算法-硬币实验的理解
  17. C语言 static用法
  18. python编写程序计算三角形的面积_编程题:编写程序输入三角形的3条边长,计算并输出三角形的面积。...
  19. c语言 日志滚动 大小,Logrotate 日志滚动 解决日志占用空间过大
  20. 二十世纪的逻辑和哲学

热门文章

  1. Linux解决Device eth0 does not seem to be present,delaying initialization问题
  2. 面试题汇总11-20
  3. token验证失败 java_“Token校验失败,请检查确认”解决方法
  4. 海南大学考研经验之(考研英语)
  5. matlab中garchred是什么意思,garch模型matlab
  6. axio的请求异常响应统一处理
  7. vuex获取php数据,vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
  8. 岁月温柔-23 妈妈转到省医院第3天 突然icu有床位了
  9. 集合和数组区别_了解您的编码基础:集合和数组之间的主要区别
  10. 白话Android音频系统原理