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个点的连通的无向图,一个点的“鸽子值”定义为将它从图中删去后连通块的个数. 求对应的点 和 每个点的“鸽子值” 用一个数组在判断割顶的那个地方 累加标记一下所连接的连通块的数量即可 初 ...
随机推荐
- Snapchat
"Mesaging service Snapchat reportedly turned down a $3 billion offer from Facebook?!" Ever ...
- 2432: [Noi2011]兔农 - BZOJ
Description 农夫栋栋近年收入不景气,正在他发愁如何能多赚点钱时,他听到隔壁的小朋友在讨论兔子繁殖的问题. 问题是这样的:第一个月初有一对刚出生的小兔子,经过两个月长大后,这对兔子从第三个月 ...
- 2124: 等差子序列 - BZOJ
Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一个整数T,表示组数.下接 ...
- CF Gym100548 K Last Defence 解题报告
先特判掉特殊情况: $a=b,Ans=2$ $ab=0,a+b>0,Ans=2$ $a=b=0,Ans=1$ 考虑剩下的非特殊情况.记$Solve(a,b)$为数列中除了$a,b$外的不同的数的 ...
- 【BZOJ】【1529】 【POI2005】ska Piggy banks
本来以为是tarjan缩点……但是64MB的空间根本不足以存下原图和缩点后的新图.所以呢……并查集= = orz hzwer MLE的tarjan: /************************ ...
- [转载]C#如何在webBrowser1控件通过TagName,Name查找元素(没有ID时)遍历窗体元素
//防止页面多次刷新页面执行 ) { string GetUserName = System.Configuration.ConfigurationSettings.AppSettings[" ...
- MATLAB——PLOT绘图
MATLAB——PLOT绘图 格式化绘图: 1.color: b g r c m y k w blue green red cyan magenta yellow black white 2.ty ...
- MonoBehaviour.StopCoroutine
MonoBehaviour.StopCoroutine Description Stops all coroutines named methodName running on this behavi ...
- hdu1874 畅通工程续
http://acm.hdu.edu.cn/showproblem.php?pid=1874 //标准最短路模板 //需要注意的是两点间可能有多组 //需要取最短的 #include<iostr ...
- apache common-io.jar FileUtils
//复制文件 void copyFile(File srcFile, File destFile) //将文件内容转化为字符串 String readFileToString(File file ...