题目链接

夜空深处,闪亮的星星以星群的形式出现在人们眼中,形态万千。

一个星群是指一组非空的在水平,垂直或对角线方向相邻的星星的集合。

一个星群不能是一个更大星群的一部分。

星群可能是相似的。

如果两个星群的形状、包含星星的数目相同,那么无论它们的朝向如何,都认为它们是相似的。

通常星群可能有 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

样例解释

样例对应的星空图如下:

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


答案:

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f3f3f3f3f
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define pb push_back
#define eps 1e-6
const int mod = 7;
const int N = 1e4 + 10;
const int M = 111;
using namespace std;int w,h;
char s[M][M];
PII dp[M*M];
int pos;double get_dist(PII a,PII b){double x=a.first-b.first;double y=a.second-b.second;return sqrt(x*x+y*y);
}double get_hash(){double res=0;for(int i=0;i<pos;i++){for(int j=i+1;j<pos;j++){res+=get_dist(dp[i],dp[j]);}}return res;
}char get_id(double s){static double Hash[N];static int cnt=0;for(int i=0;i<cnt;i++){if(fabs(s-Hash[i])<eps) return i+'a';}Hash[cnt++]=s;return cnt-1+'a';
}void DFS(int a,int b){s[a][b]='0';dp[pos++]={a,b};for(int i=a-1;i<=a+1;i++){for(int j=b-1;j<=b+1;j++){if(i!=a||j!=b){if(i>=0&&i<h&&j>=0&&j<w&&s[i][j]=='1'){DFS(i,j);}}}}
}void solve(){cin>>w>>h;for(int i=0;i<h;i++){cin>>s[i];}for(int i=0;i<h;i++){for(int j=0;j<w;j++){if(s[i][j]=='1'){pos=0;DFS(i,j);auto str=get_hash();char c=get_id(str);for(int k=0;k<pos;k++){s[dp[k].first][dp[k].second]=c;}}}}for(int i=0;i<h;i++){cout<<s[i]<<endl;}
}int main()
{solve();return 0;
}

AcWing 1402. 星空之夜(Flood Fill/哈希/DFS)相关推荐

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

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

  2. 算法提高课-搜索-Flood fill算法-AcWing 1106. 山峰和山谷:flood fill、bfs

    题目分析 来源:acwing 分析:这道题还是flood fill算法的应用,不同点在于八个方向扫描,习惯性采用二重循环来扫描周围的8个方向:其次,这里需要统计周围比它高的和比它矮的,这点用bool变 ...

  3. 算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs

    题目分析 来源:acwing 分析:找房间个数,也就是找连通的个数. 样例画出来的房间个数如下图:其中'|' 和'-'不是墙,只有#是墙. 分析:这题不用建图,直接bfs(flood fill)来做, ...

  4. 算法提高课-搜索-Flood fill算法-AcWing 1097. 池塘计数:flood fill、bfs

    Flood fill 算法简介: 像洪水一样,一圈一圈往外蔓延,像bfs. flood fill 算法可以在线性复杂度内,找到某个点所在的连通块. 题目分析 来源:acwing ac代码 #inclu ...

  5. AcWing 1113. 红与黑【《信息学奥赛一本通》】【DFS】【BFS】【Flood Fill】

    AcWing 1113. 红与黑 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 解法一(BFS): 解法二(DFS): 四.其它题解 一.题目链接 AcWing 1113. ...

  6. 算法提高课学习——2.搜索——2.1.Flood Fill算法

    Flood Fill Flood Fill算法用于求图中的连通块数量,一般用BFS实现,不过也可以使用DFS来实现,更加简洁,但同时也可能会有爆栈的风险 对于图中的任意一个点,我们从该点出发标记它所有 ...

  7. Flood Fill

    文章目录 前言 一.Flood Fill 二.例题,代码 AcWing 1097. 池塘计数 本题分析 AC代码 AcWing 1098. 城堡问题 本题分析 AC代码 AcWing 1106. 山峰 ...

  8. LeetCode Number of Islands(flood fill)

    问题:给出一个由0和1组成的二维网格图(m*n),1表示陆地,0表示水.要求统计有多少块陆地 思路:常见的flood fill算法有三种,深度优先搜索.广度优先搜索以及广度扫描法.广度扫描法其实原理与 ...

  9. flood fill算法

    flood fill算法实现有三种形式 1.depth first search 2.breadth first search 3.breadth first scan 基本思想是找到还没有分配com ...

  10. usaco The Castle(flood fill)

    问题:城堡有n*m个方块组成,方块四周可能有墙,分别用1(W),2(N),4(E),8(S)来表示,每个方块由一个数字来表示,由四周的分布的墙值和来表示.要求求出城堡有多少个房间,最大房间的大小及删除 ...

最新文章

  1. ServerSocket01
  2. JLOI2015 战争调度
  3. python装饰器作用-Python装饰器详解
  4. 角逐同城货运,快狗打车抢跑上市
  5. Css Sprites 多张图片整合在一张图片上
  6. Java Web访问.action_java设置web首页访问action
  7. C语言宏的高级应用-转
  8. 收下这份实操案例,还怕不会用Jmeter接口测试工具?!
  9. vue和aspx判断加页面传值.txt
  10. 在CentOS 7上安装Node.js的4种方法(yum安装和源码安装)
  11. mysql 手机归属地_盒子 - 手机归属地 MySql 数据
  12. 记一次大量数据导入导出SAP系统实验
  13. 主流数据库优缺点以及性能分析
  14. 20190408-相速度和群速度、傅里叶变换与波动方程的色散关系、介电常数与电导、介电函数与折射率、散度定理、电子迁移率、电磁波波动方程、自由电子气的介电函数
  15. Python 3 字符串 split( ) 方法
  16. 利用阿里云服务器制作一个浪漫的表白网页
  17. U大师U盘启动盘克隆制作工具
  18. Python必会的12道面试题,看看你会几题?
  19. 如何优化小红书笔记?教你三个小技巧,让你快速提高笔记排名
  20. TableView如何让行或列只读

热门文章

  1. 信息系统与信息化、信息系统开发方法、常规信息系统集成技术
  2. Windows10邮件添加qq邮箱已过期问题
  3. Excel中的单元格引用
  4. LimeSDR官方系列教程(四):To Pothos and Beyond
  5. CAD-Arcgis 坐标校正
  6. ubuntu如何安装rpm
  7. 什么是数据库的存储过程?
  8. vue3+ts使用Ant Design实现表格序号自增
  9. selenium设置文件下载路径
  10. Word2003入门动画教程75:在Word中插入文本框