题目链接: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. mysql 常见的几个错误问题

    Mysql常见的几个错误问题及解决方法: 1.问题: mysql DNS反解:skip-name-resolve 错误日志有类似警告: 点击(此处)折叠或打开 120119 16:26:04 [War ...

  2. iOS 提交代码出现提示弹出框显示 “A commit message is required to perform this operation.Enter a commit message and try again.“

    需要你写一下你确认提交的信息,就是你这次提交上去修改了什么功能,简单描述一下

  3. Some settings of PostgreSQL

    Here are some setting recommendations about checkpoints, some values to set in postgresql.conf. A ch ...

  4. Leetcode: Number of Islands II && Summary of Union Find

    A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...

  5. 浅谈thinkphp中将字符串转换成json数组的方法

    这是一部分代码: $client = M("Client");$data = $client->where('user_id ='.$user_id)->select( ...

  6. c++的用处

    C++准确说是一门中级语言,介于汇编和高级语言之间吧,要求程序员了解计算机的内部数据存储.个人认为,作为学生还是花功夫学C++,因为<设计模式><数据结构>这些课程基本上还是C ...

  7. JSon_零基础_001_将布尔类型数组转换为JSon格式字符串,返回给界面

    将布尔类型数组转换为JSon格式字符串,返回给界面 需要导入包: 编写bean: package com.west.webcourse.po; /** * 第01步:编写bean类, * 下一步com ...

  8. 夺命雷公狗ThinkPHP项目之----企业网站13之文章列表页的实现(主要是分页的实现)

    列表页这个其实是比较简单的一个,直接遍历除数据即可: public function lists(){ //$mod = M("Article")->select(); // ...

  9. zw版【转发·台湾nvp系列Delphi例程】HALCON Histogram

    zw版[转发·台湾nvp系列Delphi例程]HALCON Histogram unit Unit1;interfaceuses Windows, Messages, SysUtils, Varian ...

  10. zw版【转发·台湾nvp系列Delphi例程】HALCON GenGridRegion

    zw版[转发·台湾nvp系列Delphi例程]HALCON GenGridRegion unit Unit1;interfaceuses Windows, Messages, SysUtils, Va ...