【例题 6-13 UVA - 1103】Ancient Messages
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
每个图案里面的“洞”的个数都是不同的。
则可以根据这个判别每个图像是什么。
先用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的更多相关文章
- UVa 1103 Ancient Messages(二重深搜)
In order to understand early civilizations, archaeologists often study texts written in ancient lang ...
- Uva 1103 Ancient Messages
大致思路是DFS: 1. 每个图案所包含的白色连通块数量不一: Ankh : 1 ; Wedjat : 3 ; Djed : 5 ; Scarab : 4 ; Was : 0 ; Ak ...
- 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进制 你需要把它转 ...
- 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 ...
随机推荐
- 洛谷 P1877 [HAOI2012]音量调节
P1877 [HAOI2012]音量调节 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面 ...
- es64 const
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 数据结构——串的朴素模式和KMP匹配算法
一.朴素模式 假设我们要从主串S="goodgoogle"中找到子串T="google"的位置,步骤如下: i表示主串的当前位置下标,j表示子串的当前位置下标, ...
- IBM Tivoli Netview在企业网络管理中的实践(附视频)
今天我为大家介绍的一款高端网管软件名叫IBM Tivoli NetView,他主要关注是IBM整理解决方案的用户,分为Unix平台和Windwos平台两种,这里视频演示的是基于Windows 2003 ...
- java中的九大隐藏变量.
javax.servlet.jsp.JspWriter类型,代表输出流的对象.作用域为page(页面执行期) request:javax.servlet.ServletRequest的子类 ...
- tomcat:web容器
Web容器和应用服务器除了你所说的request response之外还有很多其他重要的功能. 1. 多线程和并发处理,估计你写的socket程序支持不了几个并发访问吧 2. 安全性 3. 生命周期管 ...
- VS Code 关于SFTP上传文件到多服务器的配置
工欲善其事,必先利其器! 刚学前端的时候一直用的DW来编写代码,其功能非常强大,但在Linux下不能用,所以就转VS Code了. 但是刚开始使用VS Code的时候,很多DW上的功能需要自己安装扩展 ...
- pycharm不显示工具栏,自动导入模块,格式化代码快捷键
我们需修改View里面的Toolbar,在前面打上沟,然后就可以显示了 自动导入模块设置:import numpy as np 我们需用鼠标选中numpy,然后在键盘上同时按住Alt+Enter键,通 ...
- java bigdecimal (java double也时会失真)
BigDecimal加减乘除运算 2011-11-21 21:22 6470人阅读 评论(0) 收藏 举报 stringdivjavaup工具 java.math.BigDecimal.BigDeci ...
- 顶级、块级、内联,html元素的三大分类
学习html后, 你会了解一些基本的html元素(Element), 如p, h1~h6, br, div, li, ul, img等.如果将这些元素细分, 又可以分别归为顶级(top-level)元 ...