In order to understand early civilizations, archaeologists often study texts written in ancient languages.One such language, used in Egypt more than 3000 years ago, is based on characters called hieroglyphs.Figure C.1 shows six hieroglyphs and their names. In this problem, you will write a program to recognize these six characters.

Input
The input consists of several test cases, each of which describes an image containing one or morehieroglyphs chosen from among those shown in Figure C.1. The image is given in the form of a seriesof horizontal scan lines consisting of black pixels (represented by 1) and white pixels (represented by0). In the input data, each scan line is encoded in hexadecimal notation. For example, the sequence ofeight pixels 10011100 (one black pixel, followed by two white pixels, and so on) would be represented inhexadecimal notation as 9c. Only digits and lowercase letters a through f are used in the hexadecimalencoding. The first line of each test case contains two integers, H and W. H (0 < H ≤ 200) is thenumber of scan lines in the image. W (0 < W ≤ 50) is the number of hexadecimal characters in each line. The next H lines contain the hexadecimal characters of the image, working from top to bottom.
Input images conform to the following rules:
The image contains only hieroglyphs shown in Figure C.1.
Each image contains at least one valid hieroglyph.
Each black pixel in the image is part of a valid hieroglyph.
Each hieroglyph consists of a connected set of black pixels and each black pixel has at least one other black pixel on its top, bottom, left, or right side.
The hieroglyphs do not touch and no hieroglyph is inside another hieroglyph.
Two black pixels that touch diagonally will always have a common touching black pixel.
The hieroglyphs may be distorted but each has a shape that is topologically equivalent to one of the symbols in Figure C.1. (Two figures are topologically equivalent if each can be transformed into the other by stretching without tearing.)
The last test case is followed by a line containing two zeros.
Output
For each test case, display its case number followed by a string containing one character for each
hieroglyph recognized in the image, using the following code:
Ankh: A
Wedjat: J
Djed: D
Scarab: S
Was: W
Akhet: K
In each output string, print the codes in alphabetic order. Follow the format of the sample output.

The sample input contains descriptions of test cases shown in Figures C.2 and C.3. Due to space constraints not all of the sample input can be shown on this page.

Sample Input
100 25
0000000000000000000000000
0000000000000000000000000
...(50 lines omitted)...
00001fe0000000000007c0000
00003fe0000000000007c0000
...(44 lines omitted)...
0000000000000000000000000
0000000000000000000000000
150 38
00000000000000000000000000000000000000
00000000000000000000000000000000000000
...(75 lines omitted)...
0000000003fffffffffffffffff00000000000
0000000003fffffffffffffffff00000000000
...(69 lines omitted)...
00000000000000000000000000000000000000
000000000000000000000000000000000000

00000000000000000000000000000000000000
0 0
Sample Output
Case 1: AKW
Case 2: AAAAA

题意

给你n行m列十六进制字符(0-f)每个字符等于4个二进制数(1代表黑点,0代表白点),再给你6个图,请按字典序输出所有符号

题解

首先找6个图怎么变都不会变的条件,黑点中间的白洞数量分别为(1,3,5,4,0,2)

问题就在于怎么找符号内的白洞

dfs()用于清除白点0变成2,dfs1()用于找黑点

1.首先根据输入,所有符号不会接触,也就是说,符号外的白点属于多余的白点得去掉

  这时候就需要在图的最外一圈填上0,连通所有多余的白点,dfs(0,0)

2.然后根据输入,每个符号都是1个四连块,也就是说,符号是连通的,这样只需要dfs1(黑点)

  如果是1,继续搜

  如果是0,白洞+1,dfs(这个点)

代码

 #include<bits/stdc++.h>
using namespace std;
char s[+][*+];
int dx[]={,,,-};
int dy[]={,-,,};
int n,m,cnt;
bool check(int x,int y)//边界
{
if(x>=&&x<=n+&&y>=&&y<=m*+)return true;
return false;
}
int dfs(int x,int y)//清除白点
{ if(s[x][y]=='')return ;
s[x][y]='';
for(int i=;i<;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(check(xx,yy)&&s[xx][yy]=='')
dfs(xx,yy);
}
return ;
}
int dfs1(int x,int y)//搜索黑点
{
if(s[x][y]=='')return ;
s[x][y]='';
for(int i=;i<;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(check(xx,yy))
{
if(s[xx][yy]=='')
dfs1(xx,yy);
if(s[xx][yy]=='')
cnt++,dfs(xx,yy);
}
}
return ;
}
int main()
{
int o=;
char ch;
map<char,string> ma;
ma['']="";ma['']="";ma['']="";ma['']="";ma['']="";
ma['']="";ma['']="";ma['']="";ma['']="";ma['']="";
ma['a']="";ma['b']="";ma['c']="";ma['d']="";ma['e']="";
ma['f']="";
map<int,char> mb;
mb[]='W';mb[]='A';mb[]='K';mb[]='J';mb[]='S';mb[]='D';
while(scanf("%d %d",&n,&m)!=EOF,n||m)
{
getchar();
memset(s,'',sizeof(s));//填0
for(int i=;i<=n;i++)
{
for(int j=;j<m;j++)
{
scanf("%c",&ch);
s[i][j*+]=ma[ch][];
s[i][j*+]=ma[ch][];
s[i][j*+]=ma[ch][];
s[i][j*+]=ma[ch][];
}
getchar();
}
dfs(,);
vector<char> vec;
for(int i=;i<=n+;i++)
{
for(int j=;j<=m*+;j++)
{
if(s[i][j]=='')
{
cnt=;
dfs1(i,j);
vec.push_back(mb[cnt]);
}
}
}
sort(vec.begin(),vec.end());
printf("Case %d: ",o++);
for(int i=;i<vec.size();i++)
printf("%c",vec[i]);
printf("\n");
}
return ;
}

UVa 1103 Ancient Messages(二重深搜)的更多相关文章

  1. Uva 1103 Ancient Messages

    大致思路是DFS: 1. 每个图案所包含的白色连通块数量不一: Ankh : 1 ;  Wedjat : 3  ; Djed : 5   ;   Scarab : 4 ; Was : 0  ;  Ak ...

  2. UVA 10160 Servicing Stations(深搜 + 剪枝)

    Problem D: Servicing stations A company offers personal computers for sale in N towns (3 <= N < ...

  3. UVA 165 Stamps (DFS深搜回溯)

     Stamps  The government of Nova Mareterrania requires that various legal documents have stamps attac ...

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

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

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

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

  6. hdu 1010 Tempter of the Bone(深搜+奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  7. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

  8. 利用深搜和宽搜两种算法解决TreeView控件加载文件的问题。

    利用TreeView控件加载文件,必须遍历处所有的文件和文件夹. 深搜算法用到了递归. using System; using System.Collections.Generic; using Sy ...

  9. 2016弱校联盟十一专场10.3---Similarity of Subtrees(深搜+hash、映射)

    题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52310 problem description Define the depth of a ...

随机推荐

  1. es6 初级之展开运算符

    1.1 先看一个求最大值的例子 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  2. css:在容器内文字超过容器范围,显示一行加省略号或者两行加省略号

    一.显示一行加省略号:各浏览器兼容 .box{ width: 100px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; } ...

  3. 深入Spring Boot:怎样排查expected single matching bean but found 2的异常

    写在前面 这个demo来说明怎么排查一个常见的spring expected single matching bean but found 2的异常. https://github.com/hengy ...

  4. 记一个pg连接数过多的异常

    java中使用数据库连接池,如果在部署的时候,操作不慎,可能出现典型的连接池爆满的问题 org.postgresql.util.PSQLException: FATAL: sorry, too man ...

  5. Constructor构造方法

    我们写一个car类,并写一个无参构造方法. public class Car { int speed; //构造方法名字和 类一致 区分大小写 不需要写返回值 和参数列表 public Car(){ ...

  6. Eclipse绿豆沙护眼

    Window-->Preferences-->Editors——>Text Editors —— Background color 背景颜色向你推荐:色调:85.饱和度:123.亮度 ...

  7. Java NIO Overview

    Java NIO Overview Channels and Buffers Selectors   Jakob JenkovLast update: 2014-06-23

  8. apache启动报错(98)Address already in use: make_sock: could not bind to address [::]:80

    说明80端口被用 终端:  ps -ef|grep httpd察看占用的进程或者用netstat -lnp|grep 80 找到后kill掉,如果都不行那么再试试以下方法(试过可以) 终端输入: fi ...

  9. CentOS6.5安装MySQL5.7详细教程(本人6.3也行)

    本文参考http://www.cnblogs.com/lzj0218/p/5724446.html 主要参考博文: https://segmentfault.com/a/119000000304949 ...

  10. 05_ssm基础(一)之mybatis简单使用

    01.mybatis使用引导与准备 1.ssm框架 指: sping+springMVC+mybatis 2.学习mybatis前准备web标准项目结构 model中的Ticket代码如下: pack ...