Ancient Message (古埃及象形文字识别 Uva 1103)
原题:https://uva.onlinejudge.org/external/11/1103.pdf
给一幅图(16进制), 判断图中有哪些象形文字。
只识别
这6个就可以
示例:
将16进制数据

转换为

二进制数据
然后输出象形文字的名字

原理: 其实很简单,因为这六个象形文字比较特殊,每个文字包含的空心部分个数不一样。
比如Ankh有一个空心部分,Wedjat有3个空心部分。所以只要先用dfs找到象形文字,然后数一数
每个有几个空心部分就可以了。
#include <cstdio>
#include <cstring>
#include <utility>
#include <set>
#include <algorithm>
#include <vector>
using namespace std; const int MAXN = + ;
bool pic[MAXN][MAXN], record[MAXN][MAXN];
const char *name = "WAKJSD";
int f[MAXN][MAXN], dx[] = {, -, , }, dy[] = {, , -, };
int cnt, H, W, T;
vector<pair<int, int> > startp; void init_read() {
char s[]; cnt = ; H += ; int NW = * W + ;
memset(pic, , sizeof(pic));
memset(f, , sizeof(f));
memset(record, , sizeof(record));
startp.clear();
for (int i = ; i < NW; i++) pic[][i] = pic[H - ][i] = ;
for (int i = ; i < H; i++) pic[i][] = pic[i][NW - ] = ;
for (int i = ; i < H - ; i++) {
scanf("%s", s);
for (int j = ; j < W; j++) {
int num = s[j] > '' ? s[j] - 'a' + : s[j] - '';
for (int k = ; k < ; k++)
if (num >= ( << ( - k))) { pic[i][j * + k + ] = ; num -= ( << ( - k));}
}
}
W = NW;
} void colorization(int x, int y, bool c) {
f[x][y] = cnt;
for (int i = ; i < ; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx >= && ny >= && nx < H && ny < W && pic[nx][ny] == c && !f[nx][ny])
colorization(nx, ny, c);
}
}
void floodfill() {
for (int i = ; i < H; i++)
for (int j = ; j < W; j++)
if (!f[i][j]) {
cnt++; colorization(i, j, pic[i][j]);
if (pic[i][j]) startp.push_back(make_pair(i, j));
}
} void get_signiture(set<int> &signature, int x, int y) {
record[x][y] = ;
for (int i = ; i < ; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx >= && ny >= && nx < H && ny < W) {
if (f[nx][ny] != f[x][y]) signature.insert(f[nx][ny]);
else if(f[nx][ny] == f[x][y] && !record[nx][ny])
get_signiture(signature, nx, ny);
}
}
}
void recognize() {
vector<char> ans;
int n = startp.size();
for (int i = ; i < n; i++) {
int x = startp[i].first, y = startp[i].second;
set<int> signature;
get_signiture(signature, x, y);
ans.push_back(name[signature.size() - ]);
}
sort(ans.begin(), ans.end());
printf("Case %d: ", ++T);
for (int i = ; i < n; i++)
printf("%c", ans[i]);
printf("\n");
} int main() {
while (scanf("%d%d", &H, &W) == && H) {
init_read();
floodfill();
recognize();
}
return ;
}
Ancient Message (古埃及象形文字识别 Uva 1103)的更多相关文章
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- UVa 1103 Ancient Messages(二重深搜)
In order to understand early civilizations, archaeologists often study texts written in ancient lang ...
- [uva]AncientMessages象形文字识别 (dfs求连通块)
非常有趣的一道题目,大意是给你六种符号的16进制文本,让你转化成二进制并识别出来 代码实现上参考了//http://blog.csdn.net/u012139398/article/details/3 ...
- Uva 1103 古代象形文字
题目链接:http://vjudge.net/contest/140550#problem/B 紫书P163. 1.根据16进制图转成2进制图. 每个点dfs一下,马上就把最外围的连通分量编号求出来了 ...
- UVa 1103 (利用连通块来判断字符) Ancient Messages
本题就是灵活运用DFS来求连通块来求解的. 题意: 给出一幅黑白图像,每行相邻的四个点压缩成一个十六进制的字符.然后还有题中图示的6中古老的字符,按字母表顺序输出这些字符的标号. 分析: 首先图像是被 ...
- Uva 1103 Ancient Messages
大致思路是DFS: 1. 每个图案所包含的白色连通块数量不一: Ankh : 1 ; Wedjat : 3 ; Djed : 5 ; Scarab : 4 ; Was : 0 ; Ak ...
- Ancient Messages UVA - 1103
题目链接:https://vjudge.net/problem/UVA-1103 题目大意:每组数据包含H行W列的字符矩阵(H<=200,W<=50) 每个字符为为16进制 你需要把它转 ...
- 【例题 6-13 UVA - 1103】Ancient Messages
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个图案里面的"洞"的个数都是不同的. 则可以根据这个判别每个图像是什么. 先用dfs确定轮廓之后. 再从每个白 ...
- uva 1103
弄懂题意后 其实就是一个dfs /************************************************************************* > Aut ...
随机推荐
- 写个接口的实现类,在方法的前面加了@Override居然报错
据说这是jdk的问题,@Override是JDK5就已经有了,但有个小小的Bug,就是不支持对接口的实现,认为这不是Override 而JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现 ...
- iOS自动布局之autoresizingi
对于iOS的app开发者来说,不会像Android开发者一样为很多的屏幕尺寸来做界面适配,因此硬编码的坐标也能工作良好,但是从设计模式上来说这不是好的做法.而且也还有一些问题,如iPhone5的适配, ...
- [转]Delphi Form的释放和隐藏:free,hide,close
form.Free - 释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值. form.Hide - 隐藏Form.可以调用form.Show再一次显示. form ...
- 支付宝支付错误 系统忙:错误代码AE150002999
今天出现支付宝支付错误,支付系统繁忙请稍等,错误码AE150002999.测试了其他连个收款方,可跳转到正常扫码支付页面,排除了代码错误. 在登录支付宝商家中,也签约了“即时到帐”功能.度娘和查看都找 ...
- php开发学习目录
最近有个项目需要使用php,没办法学习吧 本文不适合没有任何语言的初学者,也不适合 php熟练者.只是个人工作中需要的总结 目录 一.环境安装 1.1 apache 简介安装使用等 1.2 php 5 ...
- ASP.NET关于引用bootstrap.css导致Gridview Header无法居中
HorizontalAlign="Center" 属性因不知名原因被覆盖掉. 可以使用<HeaderStyle CssClass="text-center&qu ...
- Unity NGUI 3.0.4版本 制作网络版斗地主
Unity NGUI 3.0.4版本 @by 灰太龙 开发环境 Win7旗舰版 Unity 4.2.1f4 本文就写个开门篇,告诉大家怎么用NGUI,第一步导入NGUI 3.0.4版本! 1.启动U ...
- yum仅下载RPM包不安装
http://www.ttlsa.com/linux/howto-yum-download-rpm-without-install/
- ISO-7816-1-2-3协议
第一部分:卡的电气特性一. 卡的触点分配IC卡触点的分配遵循ISO7816-2的规定,如下所示: C1 电源电压(Vcc) C5 地(GND) C2 复位信号(RST) C6 不使用 C3 时钟信号( ...
- 禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)
一般我们不想让窗体能够关闭, 首先想到的是在OnCloseQuery事件里设置CanClose := False, 不过在某些情况下这个会和程序关闭窗体的业务逻辑产生冲突 所以写了下面这个函数, 可以 ...