Uva 1103 古代象形符号(dfs求连通块, floodfill, 进制转换)
题意:
给定一个H行W列的字符矩阵(H<200, W < 50), 输入的是一个十六进制字符, 代表一行四个相邻的二进制, 1代表像素, 0代表没有像素。
然后要求判断输入的是以下哪些图形,注意图形可以伸缩变换, 但不能拉断。

分析:
因为图形可以伸缩变换, 所以只要关注每个图形的特征,
题目表中的6个符号从左到右依次有
1,3,5,4,0,2个白洞
我们先把十六进制还原成二进制建一幅图, 然后上下各留空一行, 左右各留空一列, 先把最外面的白色floodfill了(增加两行两列后保证外面的白色可以连成一块), 然后再把整个图floodfill, 然后我们找黑色的区域(就是其中一个图形的边), 看看他们与多少个白色区域相邻, 就可以依次对应图形了。
注意的是第5个图形, 一个像素点就可以看成第5个图形。
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a) for(int i = 0; i < a; i++ )
string bin[];
char G[][*], tempG[][*];
int vis[][];
int dx[] = {,,,-};
int dy[] = {,,-,};
char arc[] = {,'W','W','A','K','J','S','D'};
int H, W, cnt;
int dfs(int x, int y, int num){
vis[x][y] = num;
for(int i = ; i < ; i++){
int tx = x + dx[i];
int ty = y + dy[i];
if(tx < || tx >= H || ty < || ty >= W || G[tx][ty] != G[x][y] || vis[tx][ty]!= )
continue;
dfs(tx,ty,num);
}
}
int neighbor(int cnt){
set<int> s;
bool vis1[][];
memset(vis1,,sizeof(vis1));
for(int i = ; i < H; i++){
for(int j = ; j < W;j ++){
if(vis[i][j] == cnt)
for(int k = ; k < ; k++){
int tx = i + dx[k];
int ty = j + dy[k];
if(tx < || tx >= H || ty < || ty >= W)
continue;
if(!vis1[tx][ty]){
vis1[tx][ty] = ;
s.insert(vis[tx][ty]);
}
}
}
}
return (int)s.size();
}
int main(){
bin[''] = "";bin[''] = "";bin[''] = "";bin[''] = "";bin[''] = "";bin[''] = "";bin[''] = "";bin[''] = "";
bin[''] = "";bin[''] = "";bin['a'] = "";bin['b'] = "";bin['c'] = "";bin['d'] = "";bin['e'] = "";bin['f'] = "";
int kase = ;
while(scanf("%d %d ", &H, &W) == && H){
for(int i = ; i < ;i++)
fill(G[i],G[i]+,'');
memset(tempG,,sizeof(tempG));
memset(vis,,sizeof(vis));
for(int i = ; i <= H; i++){
scanf("%s", tempG[i]);
for(int j = ; j< W;j++){
for(int k = ; k < ; k++){
G[i][+j*+k] = bin[tempG[i][j]][k];
}
}
}
H += ; W = W* +; cnt = ;
vector<int> edge;
for(int i = ; i < H; i++){
for(int j = ; j < W; j++){
if(!vis[i][j]){
dfs(i,j,cnt);
if(G[i][j] == ''){//如果是黑色
edge.push_back(cnt);
}
cnt++;
}
}
}
printf("Case %d: ", kase++);
string ans;
for(int i = ; i < edge.size();i++){
ans+=arc[neighbor(edge[i])];
}
sort(ans.begin(), ans.end());
for(int i = ; i < ans.size(); i++)
cout<< ans[i];
puts("");
}
}
Uva 1103 古代象形符号(dfs求连通块, floodfill, 进制转换)的更多相关文章
- UVa 572 油田(DFS求连通块)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- [uva]AncientMessages象形文字识别 (dfs求连通块)
非常有趣的一道题目,大意是给你六种符号的16进制文本,让你转化成二进制并识别出来 代码实现上参考了//http://blog.csdn.net/u012139398/article/details/3 ...
- 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 ...
- UVA 572 dfs求连通块
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...
- 用DFS求连通块(种子填充)
[问题] 输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横.竖或者对角线方向),就说它们属于同一个八连块.例如,图6-9中有两个八连块. 图6-9 [分 ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
随机推荐
- Selenium定位多个iframe嵌套中的元素
在公司boss系统中,经常会遇到多层iframe嵌套的情况,导致无法定位最里面那层iframe的元素. 其实很简单,只要一层层定位iframe,定位到你想要的那层iframe即可: 如果操作完需要返回 ...
- clock()函数的返回值精度问题
clock()函数返回值为1毫秒,就是0.001秒.clock函数功 能: 返回处理器调用某个进程或函数所花费的时间.用 法: clock_t clock(void);说明:clock_t其实就是lo ...
- Android Dialogs(4)Dialog事件处理
Passing Events Back to the Dialog's Host When the user touches one of the dialog's action buttons or ...
- jmeter(一)工具介绍(二)
1.Jmeter 概要描叙 jmeter 是一款专门用于功能测试和压力测试的轻量级测试开发平台.多数情况下是用作压力测试,该测试工具在阿里巴巴有着广泛的使用,估计是不要钱吧,哈哈,功能上来说,整个平台 ...
- 微信打开网址添加在浏览器中打开提示 http://caibaojian.com/weixin-tip.html
原文链接:http://caibaojian.com/weixin-tip.html#t2 使用微信打开网址时,无法在微信内打开常用下载软件,手机APP等.网上流传的各种微信打开下载链接,微信已更新基 ...
- http的请求与响应-----content-type
content-type 指请求消息头的中请求消息数据的格式 有三种用法 第一种:设置在request header的参数中 js中可以在发送请求前在请求消息头中设置content-typevar x ...
- reveal.js让程序员做ppt也享受快乐
前言 程序员除了会写的一手漂亮的代码,也要求做出风格优雅的PPT,诸如向领导汇报工作.向小组成员反馈项目进展自己的工作等等.就本人而言,做ppt还要去找模板,还需要设计风格,内心是焦灼的.于是乎,我搜 ...
- HTML标签的分类
html中的标签元素大体被分为三种不同的类型:块状元素.内联元素和内联块状元素.常用的块状元素有:<div>.<p>.<h1>...<h6>.<o ...
- 迅为iTOP-4418/6818开发板MiniLinux下的GPS使用手册
平台:iTOP-4418/6818开发板 系统:MiniLinux 在 Mini Linux 系统环境下 iTOP-4418 和 6818 的 GPS 实验调试步骤.给用户提供了“iTOP-4418- ...
- iTOP-4412开发板网盘资料介绍
iTOP-4412开发板网盘视频资料内容如下: 01-烧写.编译以及基础知识视频 02-嵌入式Linux 视频 03-iTOP-4412 开发板硬件设计指导视频 04-Android 应用程序视频 0 ...