UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)
UVA 572 -- Oil Deposits(DFS求连通块)
图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块。
下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常量数组或者写8条DFS调用。
下述算法是:种子填充(floodfill)
两种连通区域
四连通区域:从区域内一点出发,可通过上、下、左、右四个方向的移动组合,在不越出区域的前提下,能到达区域内的任意像素
八连通区域:从区域内每一像素出发,可通过八个方向,即上、下、左、右、左上、右上、左下、右下移动的组合,在不越出区域的前提下,能到达区域内的任意像素。
基本原理
从多边形区域内部的某一像素点(称为种子)开始,由此出发找到区域内的其它所有像素。
采用的边界定义
区域边界上所有像素均具有某个特定的颜色值,区域内部所有像素均不取这一特定颜色,而边界外的像素则可具有与边界相同的颜色值。
算法的执行过程:
从(x,y)开始,先检测该点的颜色,若它与边界色和填充色均不相同,则用填充色填充该点。然后检测相邻位置,以确定它们是否是边界色和填充色,若不是,则填充该相邻点。直到检测完区域边界范围内的所有像素为止。
从当前点检测相邻像素的方法:四连通或八连通
从四个方向寻找下一个像素,称为四向算法(只能填充四连通区域);
从八个方向寻找下一个像素,称为八向算法(可以填充八连通区域和四连通区域)。
四连通区域的种子填充递归算法:
void ZhongZiTC4 (int seedx, int seedy, int fcolor, int bcolor)
{
int current = getpixel (seedx, seedy);
if ((current != bcolor) && (current != fcolor))
{ putpixel (seedx, seedy, fcolor);
ZhongZiTC4 (seedx+, seedy, fcolor, bcolor); //右
ZhongZiTC4 (seedx–, seedy, fcolor, bcolor); //左
ZhongZiTC4 (seedx, seedy+, fcolor, bcolor); //上
ZhongZiTC4 (seedx, seedy–, fcolor, bcolor); //下
}
}
UVA 572代码:
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = +;
char deposits[maxn][maxn];
int id[maxn][maxn];
int rm,cm;
void dfs(int r,int c,int cnt)
{
///判断是否出界
if(r< || r>=rm || c< || c>=cm) return;
///临界条件
if(deposits[r][c] == '*') return;
if(id[r][c]) return; id[r][c] = cnt;
for(int i=-;i<=;i++)
for(int j=-;j<=;j++)
if(i!= || j!=) dfs(r+i,c+j,cnt); } int main()
{ while(cin>>rm>>cm && rm && cm)
{
for(int i=;i<rm;i++) cin>>deposits[i];
int cnt=;
memset(id,,sizeof(id));
for(int i=;i<rm;i++)
for(int j=;j<cm;j++)
{
if(!id[i][j] && deposits[i][j]=='@')///没有编号
dfs(i,j,++cnt);
}
cout<<cnt<<endl; }
return ;
}

UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)的更多相关文章
- HDU1241 Oil Deposits —— DFS求连通块
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241 Oil Deposits Time Limit: 2000/1000 MS (Java/Othe ...
- UVa572 Oil Deposits DFS求连通块
技巧:遍历8个方向 ; dr <= ; dr++) ; dc <= ; dc++) || dc != ) dfs(r+dr, c+dc, id); 我的解法: #include< ...
- UVa 572 油田(DFS求连通块)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 572 Oil Deposits(DFS)
Oil Deposits The GeoSurvComp geologic survey company is responsible for detecting underground oil ...
- [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: ...
- [C++]油田(Oil Deposits)-用DFS求连通块
[本博文非博主原创,均摘自:刘汝佳<算法竞赛入门经典>(第2版) 6.4 图] [程序代码根据书中思路,非独立实现] 例题6-12 油田(Oil Deposits,UVa572) 输入一个 ...
- DFS入门之二---DFS求连通块
用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所 ...
- UVA 572 dfs求连通块
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...
随机推荐
- vue--支付宝支付
1.支付宝支付:前端发起一个请求,后台返回一个页面,直接将返回的页面(一个表单),再执行表单提交 okFryOtherPayHandler(){ let reqBody = {}; reqBody.o ...
- 改变font-weight的数值,样式并不会改变的原因
通常情况下,一个特定的字体仅会包含少数的可用字重.若所指定的字重不存在直接匹配,则会通过字体匹配算法规则匹配使用邻近的可用字重.这也就是为什么我们有时候使用特定字重时没有“生效”,看起来跟其它字重差不 ...
- 简单易用的字符串模糊匹配库Fuzzywuzzy
简单易用的字符串模糊匹配库Fuzzywuzzy 阅读目录 FuzzyWuzzy 简介 安装 用法 已知移植 FuzzyWuzzy 简介 FuzzyWuzzy 是一个简单易用的模糊字符串匹配工具包.它依 ...
- PAT Basic 1013 数素数 (20 分)
令 Pi 表示第 i 个素数.现任给两个正整数 M≤N≤104,请输出 PM 到 PN 的所有素数. 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔. 输出格式: 输 ...
- mvc 母版页中登录注册和问候的处理
方式一: 在母版页直接调用方法返回,用户的session["userName"]也在母版页判断 2. 创建一个局部视图,在局部试图中将代码和数据调用写好引用单母版页 3. 自 ...
- win7安装xmanager报错error1303、err1317
安装xmanager时出现的一些问题,记录如下. 1.安装xmanager时,提示error1303.如下图,按照百度的办法,创建相应的文件夹后,点击重试. 2.重试后提示err1317,如下图所示. ...
- struts2 JSON 插件的使用
1. 导入包: json-lib-2.3-jdk15.jar struts2-json-plugin-2.3.15.3.jar 2. 在struts.xml中修改配置如下: <package n ...
- filter和filter_by 的区别
- Java定时任务的几种方法(Thread 和 Timer,线程池)
/** * 普通thread * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, * 通过sleep方法来达到定时任务的效果.这样可以快速简单的实现,代码如下: * */ ...
- C#基础进阶
观看C#高级教程进行学习.巩固基础,进阶学习. 1.委托 把方法当做参数来传递就是委托.委托的关键字是delegate. class Program { private delegate string ...