UVA 1103 - Ancient Messages(古代象形符号) By SuCicada
本题的目的是识别3000年前古埃及用到的6种象形文字,如图6-10所示。 图6-10 古代象形符号 每组数据包含一个H行W列的字符矩阵(H≤200,W≤50),每个字符为4个相邻像素点的 十六进制(例如,10011100对应的字符就是9c)。转化为二进制后1表示黑点,0表示白点。 输入满足: 不会出现上述6种符号之外的其他符号。 输入至少包含一个符号,且每个黑像素都属于一个符号。 每个符号都是一个四连块,并且不同符号不会相互接触,也不会相互包含。 如果两个黑像素有公共顶点,则它们一定有一个相同的相邻黑像素(有公共边)。 符号的形状一定和表6-9中的图形拓扑等价(可以随意拉伸但不能拉断)。 要求按照字典序输出所有符号。例如,图6-11中的输出应为AKW。 样例参见 https://www.udebug.com/UVa/1103 本家连接 分为以下几个步骤: 关键在于辨识每个图形中的空白四连块的数量。就是UVA 572 - Oil Deposits (油田) By SuCicada的升级版。 好就好在每个图形的白块数量不同,然而如何区分图形内的空白和图形外的空白是个问题。所以我在一开始就把外面的空白都涂黑了。 然后遍历,遍历到文字就将其当作油田求内部连通白块。 (最后的排序是手动实现的插入(:P) /* 1. 16进制 转 2进制 2. 从最外围开始融化 白纸 3. 遍历到文字黑色边缘, 4. 向内遍历找"油田", 即4连块 5. 计算每个文字的4连块数量 6. 结束文字们, 根据4连块数量映射文字, 排序 */ #include<iostream> #include<string> #include<algorithm> #include<cstring> using namespace std; /* 1. 16进制 转 2进制 2. 从最外围开始融化 白纸 3. 遍历到文字黑色边缘, 4. 向内遍历找"油田", 即4连块 5. 计算每个文字的4连块数量 6....