题目链接:http://vjudge.net/contest/140550#problem/B

紫书P163.

1、根据16进制图转成2进制图。

每个点dfs一下,马上就把最外围的连通分量编号求出来了为1,这个不是文字里面的空白。

2、求每个文字,四周的空白有多少。——用一个set容器,当你查看这个像素为1 的点,发现四周的点的连通分量编号不同并且不是 1 ,就可以插入到 set 中,set 防止重复。然后这种像素点为 1 对应的字符就是他的 set.size();就是有多少个空。最后对字符排序。

#include <bits/stdc++.h>
using namespace std; char bin[][]; const int maxh = ;
const int maxw = ; int H,W;
int pic[maxh][maxw],color[maxh][maxw];
char line[maxw];
const int dr[] = {-,,,};
const int dc[] = {,,-,}; ///转成像素点图
void decode(char ch,int row,int col)
{
for(int i=; i<; i++)
{
pic[row][col+i] = bin[ch][i] - '';
}
} void dfs(int row,int col,int c)
{
color[row][col] = c;
for(int i=; i<; i++)
{
int row2 = row + dr[i];
int col2 = col + dc[i];
if(row2>=&&row2<H&&col2>=&&col2<W&&pic[row2][col2]==pic[row][col]&&color[row2][col2]==)
{
dfs(row2,col2,c);
}
}
} const char* code = "WAKJSD"; vector<set<int> > neighbors; void check_neighbors(int row,int col)
{
for(int i=; i<; i++)
{
int row2 = row + dr[i];
int col2 = col + dc[i];
if(row2>=&&row2<H&&col2>=&&col2<W&&pic[row2][col2]==&&color[row2][col2]!=)
{
neighbors[color[row][col]].insert(color[row2][col2]);
}
}
} char recognize(int c)
{
int cnt = neighbors[c].size();
return code[cnt];
} int main()
{
//freopen("in.txt","r",stdin);
strcpy(bin[''], "");
strcpy(bin[''], "");
strcpy(bin[''], "");
strcpy(bin[''], "");
strcpy(bin[''], "");
strcpy(bin[''], "");
strcpy(bin[''], "");
strcpy(bin[''], "");
strcpy(bin[''], "");
strcpy(bin[''], "");
strcpy(bin['a'], "");
strcpy(bin['b'], "");
strcpy(bin['c'], "");
strcpy(bin['d'], "");
strcpy(bin['e'], "");
strcpy(bin['f'], ""); int kase = ;
while(scanf("%d%d",&H,&W),H) {
memset(color,,sizeof(color));
memset(pic,,sizeof(pic)); for(int i=;i<H;i++) {
scanf("%s",line);
for(int j=;j<W;j++) {
decode(line[j],i+,j*+);
}
} H+=;
W = W*+;
int cnt = ;
vector<int> cc; memset(color,,sizeof(color)); for(int i=;i<H;i++) {
for(int j=;j<W;j++) {
if(!color[i][j]) {
dfs(i,j,++cnt);
if(pic[i][j]==)
cc.push_back(cnt);
}
}
} neighbors.clear();
neighbors.resize(cnt+);
for(int i=;i<H;i++) {
for(int j=;j<W;j++) {
if(pic[i][j] == )
check_neighbors(i,j);
}
} vector<char> ans;
for(int i=;i<cc.size();i++)
ans.push_back(recognize(cc[i]));
sort(ans.begin(),ans.end()); printf("Case %d: ",++kase);
for(int i=;i<ans.size();i++)
printf("%c",ans[i]);
puts(""); } return ;
}

Uva 1103 古代象形文字的更多相关文章

  1. Uva 1103 古代象形符号(dfs求连通块, floodfill, 进制转换)

    题意: 给定一个H行W列的字符矩阵(H<200, W < 50), 输入的是一个十六进制字符, 代表一行四个相邻的二进制, 1代表像素, 0代表没有像素. 然后要求判断输入的是以下哪些图形 ...

  2. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

  3. Ancient Message (古埃及象形文字识别 Uva 1103)

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

  4. UVa 1103 (利用连通块来判断字符) Ancient Messages

    本题就是灵活运用DFS来求连通块来求解的. 题意: 给出一幅黑白图像,每行相邻的四个点压缩成一个十六进制的字符.然后还有题中图示的6中古老的字符,按字母表顺序输出这些字符的标号. 分析: 首先图像是被 ...

  5. uva 1103

    弄懂题意后  其实就是一个dfs /************************************************************************* > Aut ...

  6. Uva 1103 Ancient Messages

    大致思路是DFS: 1. 每个图案所包含的白色连通块数量不一: Ankh : 1 ;  Wedjat : 3  ; Djed : 5   ;   Scarab : 4 ; Was : 0  ;  Ak ...

  7. UVa 1103 Ancient Messages(二重深搜)

    In order to understand early civilizations, archaeologists often study texts written in ancient lang ...

  8. UVA 1103 How Many O's?

    题目链接:UVA-11038 题意为给定n和m,求n和m之间(包含)的所有数包含的0的个数. 思路是,用cal(x)表示小于等于x的数包含的0的个数.则答案为cal(n)-cal(m-1). 再把求c ...

  9. Ancient Messages UVA - 1103

    题目链接:https://vjudge.net/problem/UVA-1103 题目大意:每组数据包含H行W列的字符矩阵(H<=200,W<=50) 每个字符为为16进制  你需要把它转 ...

随机推荐

  1. 树链剖分(单点更新,求区间最值,区间求和Bzoj1036)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5759  Solved: 2383 [Submi ...

  2. HDU 1052 Tian Ji -- The Horse Racing(贪心)(2004 Asia Regional Shanghai)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1052 Problem Description Here is a famous story in Ch ...

  3. ./fedora_install_oracle.sh bad interpreter

    错误原因之一很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC ...

  4. Java内部类小程序(成员内部类,静态内部类,匿名内部类)

    /** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...

  5. 南阳oj27题

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上 ...

  6. java web sql注入测试(3)---现象分析

    那为什么出现以上问题呢?这是程序代码层控制不当导致的.如果web前端对输入数据控制严格,会对数据库进行操作的字符串,在客户端做敏感字符转义处理,或者在操作数据库的dao层,使用动态参数的sql,不使用 ...

  7. 衣明志是个SB

    面试碰到衣明志,问了些傻逼问题,尼玛就是一不折不扣的蠢驴. 这个人太能装了,而且水平也不咋地.

  8. uboot启动参数

    bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0bootdelay=2baudrate=115200ethaddr=08:00:3 ...

  9. laravel5.0升级到laravel5.1

    1.修改composer.json.将其中的"laravel/framework": "5.0.*"修改为"laravel/framework&quo ...

  10. java笔试题整理

    exit()是system类的方法,如system.exit(); 如果某个方法是静态的,它的行为就不具有多态性. 类后面没有括号,方法必须要有返回值.如果没有返回值,要写void 构造函数不具有多态 ...