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 ...
随机推荐
- linux网络编程之网络函数详解
1.epoll_create函数 函数声明:int epoll_create(int size) 该 函数生成一个epoll专用的文件描述符.它其实是在内核申请一空间,用来存放你想关注的socket ...
- 倒计时IE6+
很简单的 下面是我为了做多个倒计时更改之后的 dome 下载链接 兼容 IE7以上 IE6没测试应该没问题 http://yunpan.cn/cf29rxmGKuMyJ 提取码 ca61
- Codeigniter-实现权限认证
两种方法 钩子函数 集成核心Controller 方法一,钩子函数: 一直没找到CI的权限认证扩展,以前好像找到过一个老外的扩展,不过不怎么好用,现在记不清了,后来仿着jsp firter的方式用CI ...
- jQuery File Upload 插件 php代码分析
jquery file upload php代码分析首先进入构造方法 __construct() 再进入 initialize()因为我是post方式传的数据 在进入initialize()中的po ...
- Qt socket中怎么传结构体?
直接发送和接收结构体,例如:struct A {...};struct A objectA; 发送的时候: tcpSocket->write((char *)&objectA, size ...
- html文件中文在浏览器中显示乱码问题解决
利用浏览器打开html文件时,中文显示乱码,如下是原文件的内容 1 <html> 2 <head> 3 <title> ...
- Pain for friend
For a guy who has experienced his fair share of mysteries,on mystery,I still can't figure out is why ...
- Cocos2d-x init() 和 onEnter() 区别
在Cocos2d-x中经常碰到 init() 和 onEnter() init()和onEnter()这两个方法都是CCNode的方法. 1.二者的执行顺序是:先init() 后onEnter(). ...
- Thrift对多接口服务的支持
Thrift对多接口服务的支持 Thrift在0.9.1版本之前,一直只提交了对单一接口服务的支持,即一个RPC服务器(对应一个端口)支持一个服务接口的实现. 但是很多时候,我们的服务不能实现在一个接 ...
- 【视频教程】JEECG 入门视频教程大全+历史版本号代码下载
<JEECG_v3 入门视频> PPT介绍下载:http://share.csdn.net/slides/4208 ************************************ ...