Uva 1103 古代象形文字
题目链接: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 古代象形文字的更多相关文章
- Uva 1103 古代象形符号(dfs求连通块, floodfill, 进制转换)
题意: 给定一个H行W列的字符矩阵(H<200, W < 50), 输入的是一个十六进制字符, 代表一行四个相邻的二进制, 1代表像素, 0代表没有像素. 然后要求判断输入的是以下哪些图形 ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- Ancient Message (古埃及象形文字识别 Uva 1103)
原题:https://uva.onlinejudge.org/external/11/1103.pdf 给一幅图(16进制), 判断图中有哪些象形文字. 只识别 这6个就可以 示例: 将16进制数据 ...
- UVa 1103 (利用连通块来判断字符) Ancient Messages
本题就是灵活运用DFS来求连通块来求解的. 题意: 给出一幅黑白图像,每行相邻的四个点压缩成一个十六进制的字符.然后还有题中图示的6中古老的字符,按字母表顺序输出这些字符的标号. 分析: 首先图像是被 ...
- uva 1103
弄懂题意后 其实就是一个dfs /************************************************************************* > Aut ...
- Uva 1103 Ancient Messages
大致思路是DFS: 1. 每个图案所包含的白色连通块数量不一: Ankh : 1 ; Wedjat : 3 ; Djed : 5 ; Scarab : 4 ; Was : 0 ; Ak ...
- UVa 1103 Ancient Messages(二重深搜)
In order to understand early civilizations, archaeologists often study texts written in ancient lang ...
- UVA 1103 How Many O's?
题目链接:UVA-11038 题意为给定n和m,求n和m之间(包含)的所有数包含的0的个数. 思路是,用cal(x)表示小于等于x的数包含的0的个数.则答案为cal(n)-cal(m-1). 再把求c ...
- Ancient Messages UVA - 1103
题目链接:https://vjudge.net/problem/UVA-1103 题目大意:每组数据包含H行W列的字符矩阵(H<=200,W<=50) 每个字符为为16进制 你需要把它转 ...
随机推荐
- navicat 的查询功能
navicat的查询的位置在: 在编辑器界面写代码,代码完成后点左上角的运行. 代码: create(创建) table(一个表) <xxx>尖括号内的内容必填——我要创建并查询一个名叫 ...
- MySQL部分1
MySQL有三个层次 1.文件层次:放在硬盘上存东西的 必须要放在硬盘上 2.服务层次:必须要通过MySQL这个服务才能操作里面哪个内容 3.界面层次:默认不提供界面,需要安装navicat8(界面 ...
- Codeforce Round #228 Div2
这次的A题没注意要到100- -, B题没做,后来做要注意下1和long long C题当时坑的一B,用了个蠢办法,后来还错了,现在改了,还是蠢办法,等等再去用dp吧,而且本来就只有01用个鸡巴的树状 ...
- 树形dp Anniversary party(HDU1520)
题意:给出一棵树,(上下级关系)每个节点都有一个权值,要求选出一些节点满足这些节点任意连个点都不是直接的上下级关系,可以得到的最大权值是多少? 分析:对于每个点有两个状态选或者不选,用状态数组dp[u ...
- 禁用cookie后session是如何设置的
我们都知道当在session 会话有基于cookie和基于url两种传递SESSIONID的方法.为了实现客户端禁止cookie发送的情况也不影响客户登陆网站,可以设置 php.ini中 sessio ...
- POJ 2947 Widget Factory(高斯消元)
Description The widget factory produces several different kinds of widgets. Each widget is carefully ...
- git批量删除分支
要删除本地,首先要考虑以下三点 列出所有本地分支 搜索目标分支如:所有含有'dev'的分支 将搜索出的结果传给删除函数 所以我们可以得到: git br |grep 'dev' |xargs git ...
- paper 60 :转载关于视觉SCI期刊
ChanLee_1整理的计算机视觉领域稍微容易中的期刊 模式识别,计算机视觉领域,期刊 (1)pattern recognition letters, 从投稿到发表,一年半时间 (2)Pattern ...
- paper 50 :人脸识别简史与近期进展
自动人脸识别的经典流程分为三个步骤:人脸检测.面部特征点定位(又称Face Alignment人脸对齐).特征提取与分类器设计.一般而言,狭义的人脸识别指的是"特征提取+分类器"两 ...
- 【SPFA】 最短路计数
最短路计数 [问题描述] 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式] 输入第一行包含2个正整数N,M,为图的顶点数与边数. ...