【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

每个图案里面的“洞”的个数都是不同的。
则可以根据这个判别每个图像是什么。
先用dfs确定轮廓之后。
再从每个白点出发dfs,遇到的黑点且没有到达过边界,那么它就是所遇到的黑点里面的“洞”;
计算每个轮廓有多少个"洞"就好

【代码】

#include <bits/stdc++.h>
using namespace std; const int N = 200;
const int dx[5] = {0,0,0,1,-1};
const int dy[5] = {0,1,-1,0,0}; int n,m,a[N+10][N+10],flag[N+10][N+10];//flag>0 black block flag <0 white but visited
int cnt,hole[N*N+10];
char s[N+10][N+10];
int touch;
char duiying[100];
vector <char> v; void cl(int x,int y,int col){
int num = isdigit(s[x][y])?(s[x][y]-'0'):(s[x][y]-'a'+10);
for (int j = col+3;j >= col;j--){
a[x][j] = num&1;
num>>=1;
}
} void dfs(int x,int y){
if (x<0 || x>=n || y<0 || y>=m) return;
if (flag[x][y]!=0) return;
if (a[x][y]==0) return;
flag[x][y] = cnt;
for (int i = 1;i <= 4;i++) dfs(x+dx[i],y+dy[i]);
} void dfs1(int x,int y){
if (x<0 || x>=n || y <0 || y>=m){
touch = -1;
return;
}
if (flag[x][y]==-1) return;
if (flag[x][y]>0){
if (touch!=-1) touch = flag[x][y];
return;
}
flag[x][y] = -1;
for (int i = 1;i <= 4;i++) dfs1(x+dx[i],y+dy[i]);
} int main(){
// freopen("rush.txt","r",stdin);
duiying[1] = 'A',duiying[3] = 'J',duiying[5] = 'D',duiying[4] = 'S',duiying[0] = 'W',duiying[2] = 'K';
int kase = 0;
while (~scanf("%d%d",&n,&m) && n && m){
for (int i = 0;i < n;i++) scanf("%s",s[i]);
for (int i = 0;i < n;i++){
int cnt = 0;
for (int j = 0;j < m;j++){
cl(i,j,cnt);
cnt+=4;
}
}
m*=4;
memset(flag,0,sizeof flag);
cnt = 0;
for (int i = 0;i < n;i++)
for (int j = 0;j < m;j++)
if (a[i][j] && flag[i][j]==0){
++cnt;
dfs(i,j);
}
/*
for (int i = 0;i < n;i++){
for (int j = 0;j < m;j++)
printf("%3d",flag[i][j]);
puts("");
}
*/ memset(hole,0,sizeof hole);
for (int i = 0;i < n;i++)
for (int j = 0;j < m;j++)
if (a[i][j]==0 && flag[i][j]==0){
touch = 0;
dfs1(i,j);
if (touch==-1) continue;
hole[touch]++;
} // printf("hole0=%d\n",hole[0]);
v.clear();
for (int i = 1;i <= cnt;i++)
v.push_back(duiying[hole[i]]);
sort(v.begin(),v.end());
printf("Case %d: ",++kase);
for (int i = 0;i < (int) v.size();i++) putchar(v[i]);
puts("");
}
return 0;
}

【例题 6-13 UVA - 1103】Ancient Messages的更多相关文章

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

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

  2. Uva 1103 Ancient Messages

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

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

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

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

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

  5. UVa 1339 Ancient Cipher --- 水题

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

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

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

  7. Ancient Messages UVA - 1103

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

  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. Android设计模式(七)--原型模式

    1.定义: 用原型实例指定创建对象种类,并通过拷贝这些原型创建新的对象. 2.目的: 从一个对象创建另外一个可定制的对象,而不须要知道不论什么创建细节. 3.作用: 3.1.简化对象的创建. 3.2 ...

  2. 解决QML开发中ComboBox中一个已选择项没有清除的问题

    解决QML开发中ComboBox中一个已选择项没有清除的问题 近期使用QML开发一个项目.须要使用ComboBox进行显示.当进行一个操作时,须要向ComboBox加入一个元素,当进行另外一个操作时. ...

  3. Apache Spark 1.6公布(新特性介绍)

    Apache Spark 1.6公布 CSDN大数据 | 2016-01-06 17:34 今天我们很高兴可以公布Apache Spark 1.6,通过该版本号,Spark在社区开发中达到一个重要的里 ...

  4. mongo数据库--非关系型数据库

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGFuZ2xpdXFpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  5. PAT-中国大学MOOC-陈越、何钦铭-数据结构基础习题集 00-自測4. Have Fun with Numbers (20) 【二星级】

    题目链接:http://www.patest.cn/contests/mooc-ds/00-%E8%87%AA%E6%B5%8B4 题面: 00-自測4. Have Fun with Numbers ...

  6. windows10系统下设置mtu值的方法

     windows10系统下设置mtu值的方法 http://www.xitongcheng.com/jiaocheng/win10_article_34701.html 以下为服务器上使用  ip ...

  7. web api 特点

    webapi有很多特点(我不想用优点这个词),比如说restful,支持路由,简单,类似mvc controller/action的代码编写方式,灵活的托管方式,和web的集成等等. Web API的 ...

  8. arping---发送arp请求到一个相邻主机

    arping命令是用于发送arp请求到一个相邻主机的工具,arping使用arp数据包,通过ping命令检查设备上的硬件地址.能够测试一个ip地址是否是在网络上已经被使用,并能够获取更多设备信息.功能 ...

  9. Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记

    E. A Simple Task time limit per test5 seconds memory limit per test512 megabytes inputstandard input ...

  10. worktools-monkey 测试工具的使用

    配置电脑环境 1.进入用户目录下的bin cd ~/bin 2.链接一下monkey monkey -> /home/zhangshuli/git/vanzo_team/xulei/monkey ...