星空之夜

题目链接
夜空深处,闪亮的星星以星群的形式出现在人们眼中,形态万千。
一个星群是指一组非空的在水平,垂直或对角线方向相邻的星星的集合。
一个星群不能是一个更大星群的一部分。
星群可能是相似的。
如果两个星群的形状、包含星星的数目相同,那么无论它们的朝向如何,都认为它们是相似的。
通常星群可能有 8 种朝向,如下图所示:

现在,我们用一个二维 01 矩阵来表示夜空,如果一个位置上的数字是 1,那么说明这个位置上有一个星星,否则这个位置上的数字应该是 0。
给定一个夜空二维矩阵,请你将其中的所有星群用小写字母进行标记,标记时相似星群用同一字母,不相似星群用不同字母。
标注星群就是指将星群中所有的 1 替换为小写字母。

输入格式

第一行包含一个整数 W,表示矩阵宽度。
第二行包含一个整数 H,表示矩阵高度。
接下来 H 行,每行包含一个长度为 W 的 01 序列,用来描述整个夜空矩阵。

输出格式

输出标记完所有星群后的二维矩阵。
用小写字母标记星群的方法很多,我们将整个输出读取为一个字符串,能够使得这个字符串字典序最小的标记方式,就是我们想要的标记方式。
输出这个标记方式标出的最终二维矩阵。

数据范围

0≤W,H≤100,
0≤ 星群数量 ≤500,
0≤ 不相似星群数量 ≤26,
1≤ 星群中星星的数量 ≤160

输入样例:

23
15
10001000000000010000000
01111100011111000101101
01000000010001000111111
00000000010101000101111
00000111010001000000000
00001001011111000000000
10000001000000000000000
00101000000111110010000
00001000000100010011111
00000001110101010100010
00000100110100010000000
00010001110111110000000
00100001110000000100000
00001000100001000100101
00000001110001000111000

输出样例:

a000a0000000000b0000000
0aaaaa000ccccc000d0dd0d
0a0000000c000c000dddddd
000000000c0b0c000d0dddd
00000eee0c000c000000000
0000e00e0ccccc000000000
b000000e000000000000000
00b0f000000ccccc00a0000
0000f000000c000c00aaaaa
0000000ddd0c0b0c0a000a0
00000b00dd0c000c0000000
000g000ddd0ccccc0000000
00g0000ddd0000000e00000
0000b000d0000f000e00e0b
0000000ddd000f000eee000

样例解释

样例对应的星空图如下:

答案对应的标记后星空图如下:

算法分析

首先关于一个图像的形状相同,是根据一个块中所有点之间的距离和为判断标准,所有点距离之和相同就是同构同一个形状,遍历所有点就用dfs来遍历,存储这个值用一个HASH表来存储

代码实现

#include<iostream>
#include<cstring>
#include<math.h>
#include<algorithm>
#define x first     //方便写pair的变量
#define y second
using namespace std;
typedef pair<int ,int > PII;//定义坐标
const int maxn=110;
const double eps=1e-8;
int n,m;
char map[maxn][maxn];   //读图
PII q[maxn*maxn];       //q数组存储的是坐标
double ha[30];//最多有26个不相同
int cube1;              //连通块个数
int id=0;
double dis(PII a,PII b)
{double dx=a.x-b.x;double dy=a.y-b.y;return sqrt(dx*dx+dy*dy);
}
double Hash()
{double sum=0;for(int i=0;i<cube1;i++)//cube1表示有多少个连通块for(int j=i+1;j<cube1;j++)sum+=dis(q[i],q[j]);return sum;
}
char getid(double key)
{for(int i=0;i<id;i++){if(fabs(ha[i]-key)<eps)//用double存储,来判断两个值是否相同{return i+'a';}}ha[id++]=key;return id-1+'a';
}
void dfs(int a,int b)//更新连通块个数
{q[cube1++]={a,b};//将坐标存储q中map[a][b]='0';int dx[]={0,1,1,1,0,-1,-1,-1},dy[]={-1,-1,0,1,1,1,0,-1};for(int i=0;i<8;i++){int nx=a+dx[i];int ny=b+dy[i];if(nx>=0&&nx<n&&ny>=0&&ny<m&&map[nx][ny]=='1')dfs(nx,ny);}
}
int main()
{cin>>m>>n;for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin>>map[i][j];for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(map[i][j]=='1'){cube1=0;//每次重新赋0dfs(i,j);char ch=getid(Hash());for(int k=0;k<cube1;k++)map[q[k].x][q[k].y]=ch;}}}for(int i=0;i<n;i++){for(int j=0;j<m;j++)cout<<map[i][j];cout<<endl;}
}

星空之夜(哈希+DFS)相关推荐

  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. hihocoder1479 三等分

    地址:http://hihocoder.com/problemset/problem/1479 题目: 三等分 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近 ...

  4. 计算机拼歌曲,粤语歌曲填词法 (电脑软件 lyricsAID)

    粤语歌曲填词法 这是广东话歌曲填词的工具.适用于流行曲和圣诗,能将音乐简谱,转化成数字歌.对每个音符,提供配合广东话声调的字,选出成为歌词.可以在网上创作,或下载到自己电脑中使用. 创作歌词的必要条件 ...

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

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

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

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

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

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

  8. LeetCode第 57 场力扣夜喵双周赛(差分数组、单调栈) and 第 251 场力扣周赛(状态压缩动规,树的序列化,树哈希,字典树)

    LeetCode第 57 场力扣夜喵双周赛 离knight勋章越来越近,不过水平没有丝毫涨进 1941. 检查是否所有字符出现次数相同 题目描述 给你一个字符串 s ,如果 s 是一个 好 字符串,请 ...

  9. LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 BFS + DFS 1. 题目 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置. 游戏地图用大小为 n * m 的网 ...

  10. #238 蔡老板分果子 [哈希 or DFS序]

    #238 蔡老板分果子 [哈希 or DFS序] 题目描述 春天来了,万物复苏,动物们又到了发情的季节.蔡老板终于下定决心砍下了自家后院的两棵果树,并决定和自己喜欢的人一起分享果树上的果子. 这两棵果 ...

最新文章

  1. keepalived+LVS实现负载均衡集群
  2. android-Bitmap,View,Canvas大综合
  3. bootstrap使用总结
  4. C# string.Empty
  5. 【转载】“银弹”Hack(IE6、7、8beta1)
  6. Spring Setter依赖注入示例
  7. 股票代码前面为0,补齐6位数
  8. 控制台下修改系统驱动状态的代码
  9. 最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口
  10. 微信oauth2接口获取用户的openid
  11. 国行 iPhone 12/Pro/Max双卡模式支持5G网络;支付宝推出「晚点付」功能;MySQL 8.0.22 GA|极客头条
  12. 【vs2019MFC】msvcrtd.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 “int __cdecl invoke_mai
  13. 2018-2019-2 20165221 【网络对抗技术】-- Exp6 信息搜集与漏洞扫描
  14. 论文阅读4.6-4.8
  15. vcenter服务器修改ip,vcSA修改IP或hostname
  16. android相册在哪个文件夹里,手机相册在哪个文件夹?
  17. 基于SpringBoot实现邮箱找回密码
  18. xcode 翻新工程_18个著名网站的酷概念设计(翻新)
  19. appinventor拓展开发
  20. oracle 导出数据库和导入数据库

热门文章

  1. 【3D建模制作技巧分享】3dmax如何设置视图布局
  2. 缓和曲线——回旋曲线的计算
  3. 手游发展迅猛,渠道要搭建移动游戏生态圈才有出路
  4. easypoi 语法_【语法微课合集】50堂英语语法微课,视频课件免费下载,建议收藏或转发朋友圈...
  5. Excel判断身份证号码数据的第17或15位数字的奇偶性决定男女性别
  6. (10.1.4)拟物设计
  7. “好工作”的最关键指标:场景足够复杂、数据量足够大、杠杆率足够高
  8. 【swarm测试极简指南】如何获得bzz奖励?0.6.2版本手动安装指南
  9. 面试相关-转载-well,yzl——持续更新
  10. CAN网络矩阵详解,摩托罗拉(Motorala)大端序,英特尔(Intel)小端序