大致思路是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的更多相关文章

  1. UVa 1103 Ancient Messages(二重深搜)

    In order to understand early civilizations, archaeologists often study texts written in ancient lang ...

  2. K - Ancient Messages(dfs求联通块)

    K - Ancient Messages Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Subm ...

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

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

  4. UVa 1339 Ancient Cipher --- 水题

    UVa 1339 题目大意:给定两个长度相同且不超过100个字符的字符串,判断能否把其中一个字符串重排后,然后对26个字母一一做一个映射,使得两个字符串相同 解题思路:字母可以重排,那么次序便不重要, ...

  5. UVa 1103 (利用连通块来判断字符) Ancient Messages

    本题就是灵活运用DFS来求连通块来求解的. 题意: 给出一幅黑白图像,每行相邻的四个点压缩成一个十六进制的字符.然后还有题中图示的6中古老的字符,按字母表顺序输出这些字符的标号. 分析: 首先图像是被 ...

  6. Ancient Messages UVA - 1103

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

  7. 【例题 6-13 UVA - 1103】Ancient Messages

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个图案里面的"洞"的个数都是不同的. 则可以根据这个判别每个图像是什么. 先用dfs确定轮廓之后. 再从每个白 ...

  8. Ancient Message (古埃及象形文字识别 Uva 1103)

    原题:https://uva.onlinejudge.org/external/11/1103.pdf 给一幅图(16进制), 判断图中有哪些象形文字. 只识别 这6个就可以 示例: 将16进制数据 ...

  9. HDU 3839 Ancient Messages(DFS)

    In order to understand early civilizations, archaeologists often study texts written in ancient lang ...

随机推荐

  1. uva 10548 - Find the Right Changes(拓展欧几里得)

    题目链接:uva 10548 - Find the Right Changes 题目大意:给定A,B,C,求x,y,使得xA+yB=C,求有多少种解. 解题思路:拓展欧几里得,保证x,y均大于等于0, ...

  2. Android studio 开发在真机测试

    真机测试 首先按照这设置android studio:   http://jingyan.baidu.com/article/fea4511a75d627f7ba912540.html 2.打开and ...

  3. C# DateTime.Now 用法小记

    1.DateTime.Now   获取时间跟系统当前时间一直并且格式一直,如系统时间带有星期几,获取的时间也会带有 2,以下为拷贝前人总结的: //2008年4月24日 System.DateTime ...

  4. 我用过的Linux命令--虚拟机和宿主机的网络连接方式

    VMWare提供了三种工作模式,它们是bridged(bridged模式:对应网卡vment0).NAT(网络地址转换模式:对应网卡vment8)和host-only(主机模式:对应网卡vment1) ...

  5. 指定字符串加密(对称加密DES)

    /* * @(#) EncrypAES.java */ import java.security.InvalidKeyException; import java.security.NoSuchAlg ...

  6. 未能从程序集“System.ServiceModel,xxx”中加载类型“System.ServiceModel.Activation.HttpModule”。

    一.平台环境 二.问题描述 未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561 ...

  7. 解决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 ...

  8. Altium designer 10如何设置标题栏

    一.修改设置 1.执行Design-Document Option,打开文档属性对话框,设置其中title等参数. 2.执行Place-Text String,按TAB键,将Text属性中设置为&qu ...

  9. Ubuntu安装配置TFTP服务

    tftpd-hpa 是一个功能增强的TFTP服务器.它提供了很多TFTP的增强功能,它已经被移植到大多数的现代UNIX系统. 1.安装 sudo apt-get install tftpd-hpa t ...

  10. win7 资源管理器的背景色修改

    主要参考 http://blog.sina.com.cn/s/blog_49c182c20100w3nb.html win7 通过dll修改背景色首先找到这个文件C:\Windows\Resource ...