UVa 1103 古代象形符号 (Ancient Messages)

该博客主要讨论了UVa 1103编程题,涉及古代象形符号的解析。题目中给出的字符矩阵由16进制表示,需要转换为二进制并识别出6种特定形状的符号。关键点包括符号的拓扑结构、数量验证以及图形的洞数特征。博主提出了填充边界、搜索不同图形以及根据洞数判断图形类型的算法思路,指出可能需要三次DFS操作来解决,而网上常见方法仅需两次。注意边界处理,因为外围多了一层。
摘要由CSDN通过智能技术生成

每组数据包含一个H行W列的字符矩阵(H<=200, W<=50) 每个字符为4个相邻像素点的十六进制,例如10011100对应的是9c
转化为二进制后1表示黑点,0表示白点。输入满足

  • 不会出现下述六种符号之外的符号
  • 输入至少包含一个符号,且每个像素都属于一个符号
  • 每个符号都是一个四连块,并且不同的符号不会相互接触,也不会互相包含
  • 如果两个黑像素对角,那么一定有一个元素在这两个元素中间,意思就是上下左右就够用了
  • 符号的形状一定和表的图形拓扑等价(可以随意拉伸,但是不能切断)

在这里插入图片描述
要点:

  • 每个图形内部的洞是不同的,分别是,1,3,5,4,0,2个洞,洞是特征量
  • 思路:
  • 1.先遍历边缘,这个时候边缘可能有像素点,一次遍历不能遍历全,且可能边缘的像素点与边界围成圈,这样的圈不算,因此应该填充边界,赋值为-1
  • 2.填充边界后,再搜索不是0的点,赋值为2,3,……,cnt等代表不同的图形(这里的图形仍未区分)
  • 3.遍历所有0的点,查看碰到的边界是几,2的话,代表边界是2号图形,这样就可以根据洞的数量判断2号图形是什么图形
  • 可能比较麻烦,貌似网上的做法两个dfs就可以了,我却要三个
  • 注意边界。由于多了一层外围。边界需要额外处理
#include<iostream>
#include<cstring>
#include<iomanip>
#include<set>
using namespace std;
const int maxn = 200 + 10;
int pic[maxn][maxn];
bool allReturn = false;
int n, m;
int cnt;
int a[200];

const char* numArray[] = {
    "0000", "0001","0010","0011","0100",
"0101","0110","0111","1000", "1001"};
const char* alphaArray[] = {
    "1010", "1011","1100","1101","1110"
,"1111" };
void dfs1(int, int);
void dfs2(int, int);

//填充边 识别图形的边缘
void dfs1(int r, int c) {
   
	if (r < 0 || r > n + 1 || c < 0 || c > 4 * m + 7 || pic[r][c] >= 2 || pic
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值