大致思路是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. CXF详细介绍

    首先介绍下CXF的拦截器:简单地说,CXF使用流水线型(或者说总线型)处理机制,它的核心是一个Bus.一个客户端的请求或者一个对客户端桩代码的调用被组织成为一个Message.同时,所有的CXF功能都 ...

  2. Unity 通过NGUI 完成单摄像机 制作地图

    本次思想主要是通过 Ngui的Scroll View 主要是UIPanel的Clipping属性的Alipha Clip 调节窗口大小,遮蔽地图试地图实现在屏幕的部分显示.此方法的好处是不用担心sha ...

  3. VS的工程宏,比如$(SolutionDir) 的含义及查找

    Configuration->General->Output Directory->单击编辑框点下拉箭头-> <Edit...> 图1 图2

  4. 【转】OpenCV与CxImage转换(IplImage)、IplImage QImage Mat 格式互转

    最近由于在项目中用到了Opencv库,但是为了更好的显示图像还是使用了Cximage库,它可以快捷地存取.显示.转换各种图像.Opencv库用于高级图像处理与识别.为了使Cximage图像与Openc ...

  5. BZOJ 1602: [Usaco2008 Oct]牧场行走( 最短路 )

    一棵树..或许用LCA比较好吧...但是我懒...写了个dijkstra也过了.. ---------------------------------------------------------- ...

  6. php内核--SAPI概述

  7. html5 geolocation API

    清单 1. 检查浏览器支持性if (navigator.geolocation) 清单 2. 单次定位请求 API void getCurrentPosition(updateLocation, op ...

  8. android--email发送邮件,文本还有附件形式的邮件

    1.首先用的jar包为javaemail 下载地址: https://yunpan.cn/cB3kY8WIvcGtU (提取码:e042) 2.工具包 package com.kllayhello.u ...

  9. ListBox控件例子

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ListBox.aspx.c ...

  10. spring与redis集成之aop整合方案

    java使用redis缓存可以使用jedis框架,jedis操作简单,没有什么复杂的东西需要学习,网上资料很多,随便看看就会了. 将spring与redis缓存集成,其实也是使用jedis框架,只不过 ...