本题就是灵活运用DFS来求连通块来求解的。

题意:

给出一幅黑白图像,每行相邻的四个点压缩成一个十六进制的字符。然后还有题中图示的6中古老的字符,按字母表顺序输出这些字符的标号。

分析:

首先图像是被压缩过的,所以我们要把它解码成一个01矩阵。而且我们还要在原图像的四周加一圈白边,这样图中的白色背景都连通起来了。

黑色连通块的个数就是字符的个数。

观察题中字符样式可知,每种字符中包裹的“白洞”的个数是不同的,所以我们可以根据每个字符中的“白洞”的个数来区别这些字符。

然后我们给所有的连通块染色,并用color存储所标记的颜色。第一个染的是白色背景色,编号为1

把所有的黑色连通块的标号存放到cc里面

neighbors是由若干个集合所组成的数组,记录的是黑色连通块i周围相连的非背景色的白块,即“白洞”。

最后每个集合中元素的个数对应的就是字符的编号,最后排序输出即可。

一个DEBUG很久的低级错误:在DFS的时候忘了加 color[row2][col2] == 0 这一判断条件,相当于没有回溯了,当然会栈溢出,RE。这里的color顺带也起到了表示是否访问过的作用。

 //#define LOCAL
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
using namespace std; const int maxl = + ;
char bin[][], s[maxl];
const int dr[] = { , , -, };
const int dc[] = { , , , - };
int picture[maxl][maxl], color[maxl][maxl], w, h; vector<set<int> > neighbor; void decode(int row, int col, char c)
{
for(int i = ; i < ; ++i)
picture[row][col + i] = bin[c][i] - '';
} bool inside(int row, int col)
{
return row>= && row<h && col>= && col<w;
} 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(inside(row2, col2) && picture[row][col] == picture[row2][col2] && color[row2][col2] == )
DFS(row2, col2, c);
}
} void check_neighbor(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 && picture[row2][col2] == && color[row2][col2] != )//寻找"洞"
neighbor[color[row][col]].insert(color[row2][col2]);
}
} const char* code = "WAKJSD"; char recgonize(int c)
{
int a = neighbor[c].size();
return code[a];
} int main(void)
{
#ifdef LOCAL
freopen("1103in.txt", "r", stdin);
#endif 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(picture, , sizeof(picture));
for(int i = ; i < h; ++i)
{
scanf("%s", s);
for(int j = ; j < w; ++j)
decode(i+, j*+, s[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(picture[i][j] == ) cc.push_back(cnt);
} neighbor.clear();
neighbor.resize(cnt + );
for(int i = ; i < h; ++i)
for(int j = ; j < w; ++j)
if(picture[i][j] == )
check_neighbor(i, j); vector<char> ans;
for(int i = ; i < cc.size(); ++i)
ans.push_back(recgonize(cc[i]));
sort(ans.begin(), ans.end()); printf("Case %d: ", ++kase);
for(int i = ; i < ans.size(); ++i) printf("%c", ans[i]);
printf("\n");
} return ;
}

代码君

UVa 1103 (利用连通块来判断字符) Ancient Messages的更多相关文章

  1. UVA 572 油田连通块-并查集解决

    题意:8个方向如果能够连成一块就算是一个连通块,求一共有几个连通块. 分析:网上的题解一般都是dfs,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... # ...

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

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

  3. UVA 572 Oil Deposits油田(DFS求连通块)

    UVA 572     DFS(floodfill)  用DFS求连通块 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format: ...

  4. UVa 572 油田(DFS求连通块)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. Ancient Messages UVA - 1103

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

  6. UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)

    UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常 ...

  7. Uva 1103 Ancient Messages

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

  8. UVA 572 dfs求连通块

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...

  9. Doves and bombs UVA - 10765(统计割顶所连接的连通块的数量)

    题意:给定一个n个点的连通的无向图,一个点的“鸽子值”定义为将它从图中删去后连通块的个数. 求对应的点 和 每个点的“鸽子值” 用一个数组在判断割顶的那个地方 累加标记一下所连接的连通块的数量即可 初 ...

随机推荐

  1. 小杜同学关于Query的一点知识

    小杜同学关于jQuery的一点知识 1.关于jQuery jQuery就是一个JavaScript的函数库.既然是JS的的函数库,它自然是做JS做的东西了.毕竟jQuery只是用JavaScript编 ...

  2. [转载]非常完善的Log4net详细说明

    前言 此篇文章是我见过写得最好的一片关于Log4Net的文章,内容由简入难,而且面面俱到,堪称入门和精通的佳作,特从懒惰的肥兔的转载过来. 1.概述 log4net是.Net下一个非常优秀的开源日志记 ...

  3. 2391: Cirno的忧郁 - BZOJ

    Description Cirno闲着无事的时候喜欢冰冻青蛙.Cirno每次从雾之湖中固定的n个结点中选出一些点构成一个简单多边形,Cirno运用自己的能力能将此多边形内所有青蛙冰冻.雾之湖生活着m只 ...

  4. Ext学习-基础组件介绍

    1.目标    学习对象获取,组件基础,事件模型以及学习ExtJS中的基础组件的应用. 2.内容   1.对象获取   2.组件原理以及基础   3.事件模型   4.常用组件的介绍 3.学习步骤 1 ...

  5. 【BZOJ】【1051】【HAOI2005】受欢迎的牛

    按B->A连边,tarjan缩点,然后找入度为0的连通分量,如果有1个,则ans=size[i],如果大于一个则ans=0: 当然如果按A->B连边就是找出度为0的(表示没有被它喜欢的,这 ...

  6. PHP之Error与Logging函数讲解

    PHP Error 和 Logging 简介 error 和 logging 函数允许你对错误进行处理和记录. error 函数允许用户定义错误处理规则,并修改记录错误的方式. logging 函数允 ...

  7. Kafka之Purgatory Redesign Proposal (翻译)

    Purgatory是Kafka server中处理请求时使用的一个重要的数据结构.正好研究ReplicaManager源码的时候发现了这篇文章,顺便翻译下.由于这个proposal里的很多东西需要看源 ...

  8. Android开发--Activity生命周期回顾理解

    Activity和Servlet一样,都用了回调机制.我们通过类比servlet来学习Activity.当一个servlet开发出来之后,该servlet运行于Web服务器中.服务器何时创建servl ...

  9. 读写txt文件

    public void SetUpdateTime(string strNewDate) { try { var path =Application.StartupPath + Configurati ...

  10. Windows7查看本地Java安装是否成功和路径的方法

    1. 在电脑开始出,点击运行,输入:CMD.右击图标以管理员身份运行.