[uva]AncientMessages象形文字识别 (dfs求连通块)
非常有趣的一道题目,大意是给你六种符号的16进制文本,让你转化成二进制并识别出来
代码实现上参考了//http://blog.csdn.net/u012139398/article/details/39533409
#include<cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <set> using namespace std; const int MAXH = ;
const int MAXW = ;
int H,W;
int dx[] = {, , -, };
int dy[] = {, -, , };
char* bin[]= {"","","","","","","",""
,"","","","","","","",""};
char code[] = "WAKJSD"; char pic1[MAXH][MAXW];
char pic[MAXH][MAXW<<];
int color[MAXH][MAXW<<]; void dfs(int x,int y,int col)
{
color[x][y] = col;
for(int i = ; i < ; ++i){
int nx = x + dx[i], ny = y + dy[i];
if(nx >= && nx < H && ny >= && ny < W
&& pic[x][y] == pic[nx][ny] && !color[nx][ny])
dfs(nx,ny,col);
}
}
int main()
{
// freopen("in.txt","r",stdin);// FE
int cas = ;
while(scanf("%d%d",&H,&W),H){ memset(pic,,sizeof(pic));
memset(color,,sizeof(color)); for(int i = ; i < H; ++i)
scanf("%s",pic1[i]);
for(int i = ; i < H; ++i)
for(int j = ; j < W; ++j){
if(pic1[i][j]<=''&&''<=pic1[i][j])
pic1[i][j] -= '';
else
pic1[i][j] -= 'a' - ;
for(int k = ; k < ; ++k){//decode
pic[i+][+(j<<)+k] = bin[pic1[i][j]][k] - '';
}
} H += ;
W = (W<<)+;
vector<int> cc;
int cnt = ;//cnt = 1一定是白色背景
for(int i = ; i < H; ++i)
for(int j = ; j < W; ++j){
if(!color[i][j]) {
dfs(i,j,++cnt);
if(pic[i][j] == ) cc.push_back(cnt);//记录黑色所在的连通块 //!!没放到括号里
} } vector< set<int> > neigh(cnt+);
for(int i = ; i < H; ++i)
for(int j = ; j < W; ++j) {
if(pic[i][j]){
for(int k = ; k < ; ++k){
int x = i + dx[k], y = j + dy[k];
if(x >= && x < H && y >= && y < W
&& pic[x][y] == && color[x][y] != )
neigh[color[i][j]].insert(color[x][y]);
}
}
} vector<char> ans;
for(int i = ; i < cc.size(); ++i)
ans.push_back(code[neigh[cc[i]].size()]);
sort(ans.begin(),ans.end()); printf("Case %d: ",++cas);
for(int i = , sz = ans.size(); i < sz; ++i)
printf("%c",ans[i]);
puts("");
}
return ;
}
[uva]AncientMessages象形文字识别 (dfs求连通块)的更多相关文章
- UVa 572 油田(DFS求连通块)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 572 Oil Deposits油田(DFS求连通块)
UVA 572 DFS(floodfill) 用DFS求连通块 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format: ...
- UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)
UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常 ...
- DFS入门之二---DFS求连通块
用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所 ...
- [C++]油田(Oil Deposits)-用DFS求连通块
[本博文非博主原创,均摘自:刘汝佳<算法竞赛入门经典>(第2版) 6.4 图] [程序代码根据书中思路,非独立实现] 例题6-12 油田(Oil Deposits,UVa572) 输入一个 ...
- HDU1241 Oil Deposits —— DFS求连通块
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241 Oil Deposits Time Limit: 2000/1000 MS (Java/Othe ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- UVA 572 dfs求连通块
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...
- 用DFS求连通块(种子填充)
[问题] 输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横.竖或者对角线方向),就说它们属于同一个八连块.例如,图6-9中有两个八连块. 图6-9 [分 ...
随机推荐
- Linux下使用doxygen+vim生成c语言源程序文档的方法
1.安装 doxygen 有两种获得 doxygen 的方法.可以下载预编译的可执行文件,也可以从 SVN 存储库下载源代码并自己编译.清单 1 演示的是后一种方法. 清单 1. 安装和构建 doxy ...
- SetROP2
一个Windows API SetROP2(int nDrawMode)的使用 该函数的主要的作用是根据nDrawMode设置的方式重新设定绘图的方式,下面就不同的nDrawMode值具体解释绘图模式 ...
- ms sql server line feed
多行文本换行: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ======================================== ...
- debian 7上源码编译MongoDB 3.4版本
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 要想精通一个数据库,除了知道该数据库的功能特性.使用方法等,还需要能够看懂数据库源码,能够使用gdb工具对其 ...
- Fiddler如何抓取HTTPS协议的网页
Fiddler默认只能抓取HTTP协议的网页,不能抓取HTTPS协议的网页,而我们很多时候,都需要抓HTTPS协议的网页,比如抓淘宝数据等.今天,韦玮老师会为大家讲解如何使用Fiddler抓取HTTP ...
- 文本主题抽取:用gensim训练LDA模型
得知李航老师的<统计学习方法>出了第二版,我第一时间就买了.看了这本书的目录,非常高兴,好家伙,居然把主题模型都写了,还有pagerank.一路看到了马尔科夫蒙特卡罗方法和LDA主题模型这 ...
- Linux之vim基本命令操作
安装vim(yum -y install vim) 三种工作模式(命令模式.输入模式.编辑模式) 打开文件( vi ) 查找文本( / ) 替换文本 删除文本( dd 删除光标所在行 ) 复制文本 去 ...
- redis win连接以及配置连接密码
redis连接格式为 redis-cli -h host -p port -a password 但由于刚安装的redis是没有密码的 因此可以进行直接连接, cd转到redis目录里 redis-c ...
- Codeforces Round #360 (Div. 1)A (二分图&dfs染色)
题目链接:http://codeforces.com/problemset/problem/687/A 题意:给出一个n个点m条边的图,分别将每条边连接的两个点放到两个集合中,输出两个集合中的点,若不 ...
- IT兄弟连 JavaWeb教程 异步请求对象的API
Ajax的核心是XMLHttpRequest对象(xhr),xhr为向服务器发送请求和解析服务器响应提供了接口,能够以异步的方式从服务器获取新数据. xhr的主要方法有: ● void open(S ...