UVa 1103 (利用连通块来判断字符) Ancient Messages
本题就是灵活运用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的更多相关文章
- UVA 572 油田连通块-并查集解决
题意:8个方向如果能够连成一块就算是一个连通块,求一共有几个连通块. 分析:网上的题解一般都是dfs,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... # ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- UVA 572 Oil Deposits油田(DFS求连通块)
UVA 572 DFS(floodfill) 用DFS求连通块 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format: ...
- UVa 572 油田(DFS求连通块)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Ancient Messages UVA - 1103
题目链接:https://vjudge.net/problem/UVA-1103 题目大意:每组数据包含H行W列的字符矩阵(H<=200,W<=50) 每个字符为为16进制 你需要把它转 ...
- UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)
UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常 ...
- Uva 1103 Ancient Messages
大致思路是DFS: 1. 每个图案所包含的白色连通块数量不一: Ankh : 1 ; Wedjat : 3 ; Djed : 5 ; Scarab : 4 ; Was : 0 ; Ak ...
- UVA 572 dfs求连通块
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...
- Doves and bombs UVA - 10765(统计割顶所连接的连通块的数量)
题意:给定一个n个点的连通的无向图,一个点的“鸽子值”定义为将它从图中删去后连通块的个数. 求对应的点 和 每个点的“鸽子值” 用一个数组在判断割顶的那个地方 累加标记一下所连接的连通块的数量即可 初 ...
随机推荐
- Backbone.Events—纯净MVC框架的双向绑定基石
Backbone.Events-纯净MVC框架的双向绑定基石 为什么Backbone是纯净MVC? 在这个大前端时代,各路MV*框架如雨后春笋搬涌现出来,在infoQ上有一篇 12种JavaScrip ...
- 简单制作mib表
今天放假后第一天上班,将假前自学制作mib表的东西说一下. 在这里呢,我以世界-中国-上海-闵行这种包含关系介绍,感觉更容易理解. MIB file的开始和结束 所有的MIB file的都以DEFIN ...
- clion 帮助文档 EN
下载时间 2015年10月 下载地址:http://pan.baidu.com/s/1E4fgE 备用地址:链接:http://pan.baidu.com/s/1bn6u5Wj 密码:icn4
- 2208: [Jsoi2010]连通数 - BZOJ
Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图 ...
- Struct2 自定义拦截器
1 因为struct2 如文件上传,数据验证等功能都是由系统默认的 defalutStack中的拦截器实现的,所以我们定义拦截器需要引用系统默认的defalutStack 这样才不会影响struct2 ...
- xargs 加 gm批量转换图片
%x50% @ ../-\ 南澳西涌_50%/@ 看了很多说明上都在用-i,这是一个已经废弃了的参数
- iOS 委托和协议区别和联系
iOS上的协议类似于C#.Java上面的接口,他是从类中抽出来的一系列方法,但方法的实现是在实现这个协议的类中,任何实现这个协议的类都需要实现协议类中的@require方法: 委托是一种设计模式,是一 ...
- 微信变声器(WeChat Voice)会是营销新利器吗
微信变声器(WeChat Voice)2.0 Android版开始内测了,时间从2015年5月20日 - 2015年6月20日,使用微信变声器改变你的声音,并分享给好友! 无论你是想装可爱还是恶搞,微 ...
- Python-aiohttp百万并发
http://www.aikaiyuan.com/10935.html 本文将测试python aiohttp的极限,同时测试其性能表现,以分钟发起请求数作为指标.大家都知道,当应用到网络操作时,异步 ...
- Python性能分析指南
http://www.admin10000.com/document/2861.html 尽管并非每个你写的Python程序都需要严格的性能分析,但了解一下Python的生态系统中很多优秀的在你需要做 ...