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 ...
随机推荐
- uva 10548 - Find the Right Changes(拓展欧几里得)
题目链接:uva 10548 - Find the Right Changes 题目大意:给定A,B,C,求x,y,使得xA+yB=C,求有多少种解. 解题思路:拓展欧几里得,保证x,y均大于等于0, ...
- Android studio 开发在真机测试
真机测试 首先按照这设置android studio: http://jingyan.baidu.com/article/fea4511a75d627f7ba912540.html 2.打开and ...
- C# DateTime.Now 用法小记
1.DateTime.Now 获取时间跟系统当前时间一直并且格式一直,如系统时间带有星期几,获取的时间也会带有 2,以下为拷贝前人总结的: //2008年4月24日 System.DateTime ...
- 我用过的Linux命令--虚拟机和宿主机的网络连接方式
VMWare提供了三种工作模式,它们是bridged(bridged模式:对应网卡vment0).NAT(网络地址转换模式:对应网卡vment8)和host-only(主机模式:对应网卡vment1) ...
- 指定字符串加密(对称加密DES)
/* * @(#) EncrypAES.java */ import java.security.InvalidKeyException; import java.security.NoSuchAlg ...
- 未能从程序集“System.ServiceModel,xxx”中加载类型“System.ServiceModel.Activation.HttpModule”。
一.平台环境 二.问题描述 未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561 ...
- 解决spark运行中failed to locate the winutils binary in the hadoop binary path的问题
1.下载hadoop-common-2.2.0-bin并解压到某个目录 https://github.com/srccodes/hadoop-common-2.2.0-bin 2.设置hadoop.h ...
- Altium designer 10如何设置标题栏
一.修改设置 1.执行Design-Document Option,打开文档属性对话框,设置其中title等参数. 2.执行Place-Text String,按TAB键,将Text属性中设置为&qu ...
- Ubuntu安装配置TFTP服务
tftpd-hpa 是一个功能增强的TFTP服务器.它提供了很多TFTP的增强功能,它已经被移植到大多数的现代UNIX系统. 1.安装 sudo apt-get install tftpd-hpa t ...
- win7 资源管理器的背景色修改
主要参考 http://blog.sina.com.cn/s/blog_49c182c20100w3nb.html win7 通过dll修改背景色首先找到这个文件C:\Windows\Resource ...