题意:
很有意思的一道题,建议先去看完原文再回过头来看这篇博客。
大致意思是给出6种古埃及符号,输入一幅黑白图像的16进制表示,要求识别每幅图像中的符号并按照字典序输出。
6种古埃及符号如下图所示:
题目输入:
每组测试数据包含一个H行W列的字符矩阵 ( H ≤ 200 , W ≤ 50 ) (H ≤ 200,W ≤50) (H≤200,W≤50),每个字符为4个相邻的像素点的十六进制 (例如:字符 c c c对应的四个像素点就是 1100 1100 1100),转化为二进制后的 1 1 1表示黑点, 0 0 0表示白点。
且输入满足:
- 不会出现上述6种符号以外的其他符号
- 输入至少包含一个符号,并且输入的每一个黑点都属于一个符号
- 每个符号的黑色像素都相互连接,并且不同的符号不会相互接触,也不会互相包含
- 如果两个黑色素有公共的顶点,则它们i顶有一个相同的相邻黑像素
- 符号的形状一定和上述中的图形拓补等价(即可以任意拉伸但是不能拉断)
输出
按照字典顺序输出每个字符的缩写,上述 6 6 6个符号的缩写从左到右分别为 A J D S W K
例:输入下面图形的16进制表示,输出AKW
想要完全理解这道题的意思并不容易,你需要了解一点关于图像的知识。事实上,再复杂不过的图片,也可以拆分为两部分,一是图像的轮廓,二是图像的颜色。轮廓是二维平面上的点集,因而图像本质上就是二维平面上的一些带颜色点组成的集合,虽然在数学上点是无法定义的,它只有位置,而没有形状,但是我们却可以用一个足够小的区域去逼近一个点,然后区域的颜色就近似为这个点的颜色,这样我们就可以用这样一个近似的“点”去“画”图了。仔细一想,我们生活中用的铅笔,圆珠笔等不都是这样一个道理吗?
而在计算机中,这样一个近似的点其实就是所谓的像素点,也就是一个小小的矩形格子,每个格子都有一个颜色,就是所谓的像素点的颜色,为了存储方便,每一种颜色的像素点都用一个数值来表示。这样,图像在计算机中就可以表示为一个二维的矩阵。此处题目的输入正是采用了这样一种方式,由于这道题我们只关心图像的形状,故而只需要黑白(分别用1和0表示)两种颜色即可。
由于输入的符号可以随意拉伸,看起来我们不能拘泥于细节,而是要找到一个不会随着任意拉伸而变化的特征量。细品题目对于输入的描述,每个符号的所有黑色像素都相互连接,而不同的符号互相之间没有交集,即每个符号的黑像素点集都是一个连通集,中间有一些白色像素点组成的洞,数一数就能发现,6种符号从左往右依次有1,3,5,4,0,2个白洞,互不相同,可以作为我们判断符号的特征量。
进一步,我们可以利用每个符号的黑像素为连通集并且每个白洞也是一个连通集的特点,进行如下步骤判断符号:
1.首先给整幅图加上一层白色边框,使所有的非白洞白色像素点构成一个连通集
2. DFS遍历所有非白洞像素点,全部标记为2
3. 检查图像中的黑色像素点,每次找到一个黑色像素点&