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进制 你需要把它转 ...
随机推荐
- struts2的处理流程_2015.01.05
01:首先经过web.xml里面的拦截 StrutsPrepareAndExecuteFilter 02:然后struts2内置的一些拦截器或用户自定义拦截器 Interceptor 03:用户编写的 ...
- sql 去除列中内容的单引号
update [dbo].[历史数据补全$] set bankCardNo=replace(bankCardNo,'''','') 总共4个单引号,外边2个是字符串固有的2个,里边两个就表示是一 ...
- java 与 R 相互调用
https://www.r-project.org/ http://cos.name/2013/08/r-rjava-java/ http://blog.csdn.net/hwssg/article/ ...
- [Ubuntu] 转载-使用Ubuntu修复grub
原文地址:http://fav.coketea.com/article_show.php?id=1 步骤一.以试用方式进入ubuntu光盘系统,打开终端(快捷键ctrl+alt+t): 步骤二.获取r ...
- install chrome in elementary os
Elementary OS Freya 0.3.2 was officially out for public. As previous release, it comes pre-installed ...
- MySQL函数汇总
前言 MySQL提供了众多功能强大.方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,从而更加灵活地满足不同用户的需求.本文将MySQL的函数分类并汇总,以便以后用到的时候可以随时 ...
- [转]通过PowerShell工具跨多台服务器执行SQL脚本
转至:http://www.cnblogs.com/SameZhao/p/4743692.html 有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力.省心 ...
- 互联网公司前端初级Javascript面试题
互联网公司前端初级Javascript面试题 1.JavaScript是一门什么样的语言,它有哪些特点?(简述javascript语言的特点)JavaScript是一种基于对象(Object)和事件驱 ...
- Hibernate解决n+1问题
观点:对于n+1问题的理解. 一般而言说n+1意思是,无论在一对多还是多对一当查询出n条数据之后,每条数据会关联的查询1次他的关联对象,这就叫做n+1. 但是我的理解是,本来所有信息可以一次性查询出来 ...
- 为什么anylase和scenaio中的平均响应时间差别会这么大?
场景里的响应时间截图如下所示: 结果里的响应时间截图如下所示: