Uva 1103 Ancient Messages
大致思路是DFS:
1. 每个图案所包含的白色连通块数量不一:
Ankh : 1 ; Wedjat : 3 ; Djed : 5 ; Scarab : 4 ; Was : 0 ; Akeht : 2
根据每个图包含的白色连通块判断是哪个图案
2. 两个Dfs函数,一个判断白色,一个判断黑色;判断黑色的Dfs,一旦发现白色,就调用判断白色的Dfs,同时白色连通块计数器加一
3. 我开始比较疑惑的一个地方是:如何判断这个白色块是在一个黑色图案里面还是外面?后来才明白:只要一开始在图外面再加一层白色框框,然后开始访问白色,把此时访问到的所有白色设为不可访问即可,这样子就不会把图案里面的白色连通块和外面的混淆了
一点感悟和收获:这题确实再某种程度上刷新了我“的世界观“,初看题意,啥想法都没有,后来再看看书,再看看别人的题解,才发现,这题实在太简单了!说白了,一开始把题目想复杂了,没发现浅显的规律,如果能静下心来,仔细发现规律的话,这题真的比我最初想像的简单太多了!
参考资料:
1. http://www.cnblogs.com/hanbinggan/p/4225044.html
2. 《算法竞赛入门经典(第二版)》
#include <bits/stdc++.h> using namespace std; const int MAXN = 200 + 10;
int plan[MAXN][MAXN];
int counter[MAXN];
char apl[] = "ADJKSW";
int H, W; void Read() {
memset(plan, 0, sizeof(plan));
char c;
int pos;
for(int i=1; i<=H; i++) {
pos = 1;
for(int j=1; j<=W; j++) {
cin >> c;
if(isalpha(c)) {
c = c - 'a' + 10;
} else {
c = c - '0';
}
// Transfer to binary
pos += 3;
for(int k=0; k<4; k++) {
plan[i][pos --] = c % 2;
c /= 2;
}
pos +=5;
}
}
W *= 4;
} bool Inside(int x, int y) {
return x>=0 && x<=H+1 && y>=0 && y<=W+1;
} int cnt;
void DfsWhite(int x, int y) {
if(!Inside(x, y) || plan[x][y]!=0) {
return ;
}
plan[x][y] = -1;
DfsWhite(x, y+1);
DfsWhite(x, y-1);
DfsWhite(x+1, y);
DfsWhite(x-1, y);
} void DfsBlack(int x, int y) {
if(!Inside(x, y) || plan[x][y] == -1) return ;
if(plan[x][y] == 0) {
++ cnt;
DfsWhite(x, y);
return ;
}
plan[x][y] = -1;
DfsBlack(x, y+1);
DfsBlack(x, y-1);
DfsBlack(x+1, y);
DfsBlack(x-1, y);
} int Case = 0;
void Work() {
Read();
DfsWhite(0, 0); // the white blocks outside the hieroglyphs
memset(counter, 0, sizeof(counter));
for(int i=1; i<=H; i++) {
for(int j=1; j<=W; j++) {
if(plan[i][j] == 1) {
cnt = 0;
DfsBlack(i, j);
switch(cnt) {
case 0: counter['W'] ++; break;
case 1: counter['A'] ++; break;
case 2: counter['K'] ++; break;
case 3: counter['J'] ++; break;
case 4: counter['S'] ++; break;
case 5: counter['D'] ++; break;
}
}
}
}
cout << "Case " << (++Case) << ": ";
for(int i=0; i<6; i++) {
for(int j=0; j<counter[apl[i]]; ++j) {
cout << apl[i];
}
}
cout << endl;
} int main() {
ios::sync_with_stdio(false);
cin.tie(0);
while(cin >> H >> W && (H + W)) {
Work();
}
return 0;
}
Uva 1103 Ancient Messages的更多相关文章
- UVa 1103 Ancient Messages(二重深搜)
In order to understand early civilizations, archaeologists often study texts written in ancient lang ...
- K - Ancient Messages(dfs求联通块)
K - Ancient Messages Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Subm ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- UVa 1339 Ancient Cipher --- 水题
UVa 1339 题目大意:给定两个长度相同且不超过100个字符的字符串,判断能否把其中一个字符串重排后,然后对26个字母一一做一个映射,使得两个字符串相同 解题思路:字母可以重排,那么次序便不重要, ...
- UVa 1103 (利用连通块来判断字符) Ancient Messages
本题就是灵活运用DFS来求连通块来求解的. 题意: 给出一幅黑白图像,每行相邻的四个点压缩成一个十六进制的字符.然后还有题中图示的6中古老的字符,按字母表顺序输出这些字符的标号. 分析: 首先图像是被 ...
- Ancient Messages UVA - 1103
题目链接:https://vjudge.net/problem/UVA-1103 题目大意:每组数据包含H行W列的字符矩阵(H<=200,W<=50) 每个字符为为16进制 你需要把它转 ...
- 【例题 6-13 UVA - 1103】Ancient Messages
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个图案里面的"洞"的个数都是不同的. 则可以根据这个判别每个图像是什么. 先用dfs确定轮廓之后. 再从每个白 ...
- Ancient Message (古埃及象形文字识别 Uva 1103)
原题:https://uva.onlinejudge.org/external/11/1103.pdf 给一幅图(16进制), 判断图中有哪些象形文字. 只识别 这6个就可以 示例: 将16进制数据 ...
- HDU 3839 Ancient Messages(DFS)
In order to understand early civilizations, archaeologists often study texts written in ancient lang ...
随机推荐
- Android二维码开源项目zxing用例简化和生成二维码、条形码
上一篇讲到:Android二维码开源项目zxing编译,编译出来后有一个自带的測试程序:CaptureActivity比較复杂,我仅仅要是把一些不用的东西去掉,用看起来更方便,二维码和条形码的流行性自 ...
- Hive索引
1. Hive索引概述 Hive的索引目的是提高Hive表指定列的查询速度. 没有索引时.类似'WHERE tab1.col1 = 10' 的查询.Hive会载入整张表或分区.然后处理全 ...
- android技术牛人的博客[转]
Android+JNI调用–文件操作 开发环境:Windows xp sp3 +MyEclipse 8.6+android2.3.3+jdk1.6+android-ndk-r6b JNI概述: ...
- js中if的简写方法
http://transitions1020.com/# 太帅! <script type="text/javascript"> 如果你想写 if (!false) { ...
- hdu 2519 新生晚会 排列组合
通过阶段性计算减少一次性的大值计算 #include <stdio.h> int main() { int t, a, b, i; __int64 c; scanf("%d&qu ...
- Trie implementation
在学习 Aho - Corasick Automation Algorithm 之前,先学习一下,Trie 的实现过程: The name trie comes from its use for re ...
- 条款16:成对使用new和delete时,采取相同的形式
问题聚焦: 我们都知道,new和delete要成对使用,但是有时候,事情往往不是按我们预期的那样发展. 对于单一对象和对象数组,我们要分开考虑. 遇到typedef时,也需要搞 ...
- winform代码:关联窗体数据更新,删除dataGridview中选中的一行或多行
一.关联窗体数据更新 关联窗体数据修改时,如果一个为总体数据显示窗体A,另一个为详细修改窗体B,从A进入B,在B中对数据进行修改,然后返回A,这时A窗体的数据需要更新. 我采用最简单的方法,首先保证每 ...
- javascript 原型 和 原型链
最近几天,好些新同事来问原型,原型链啥的.本身作为菜鸟的我好像也没有好好整理过这个,这里写写自己的理解. 原型 大家都知道,JavaScript 不包含传统的类继承模型,而是使用 prototype ...
- C#计算时间差。
C#中怎么计算两时间相差多少.计算2个时间之间的差,可以计算到时分秒! <1>label1.Text = “2004-1-1 15:36:05″;label2.Text = “2004-3 ...