UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)

UVA 572 -- Oil Deposits(DFS求连通块)

  图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块。

  下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常量数组或者写8条DFS调用。

  下述算法是:种子填充(floodfill)

  两种连通区域

  四连通区域:从区域内一点出发,可通过上、下、左、右四个方向的移动组合,在不越出区域的前提下,能到达区域内的任意像素

  八连通区域:从区域内每一像素出发,可通过八个方向,即上、下、左、右、左上、右上、左下、右下移动的组合,在不越出区域的前提下,能到达区域内的任意像素。

  基本原理

  从多边形区域内部的某一像素点(称为种子)开始,由此出发找到区域内的其它所有像素。

  采用的边界定义

  区域边界上所有像素均具有某个特定的颜色值,区域内部所有像素均不取这一特定颜色,而边界外的像素则可具有与边界相同的颜色值。

  算法的执行过程:

  从(x,y)开始,先检测该点的颜色,若它与边界色和填充色均不相同,则用填充色填充该点。然后检测相邻位置,以确定它们是否是边界色和填充色,若不是,则填充该相邻点。直到检测完区域边界范围内的所有像素为止。
   从当前点检测相邻像素的方法:四连通或八连通
   从四个方向寻找下一个像素,称为四向算法(只能填充四连通区域);
   从八个方向寻找下一个像素,称为八向算法(可以填充八连通区域和四连通区域)。

  四连通区域的种子填充递归算法:

 1 void ZhongZiTC4 (int seedx, int seedy, int fcolor, int bcolor)
 2 {
 3      int current = getpixel (seedx, seedy);
 4      if ((current != bcolor) && (current != fcolor))
 5      {     putpixel (seedx, seedy, fcolor);
 6      ZhongZiTC4 (seedx+1, seedy, fcolor, bcolor);  //右
 7      ZhongZiTC4 (seedx–1, seedy, fcolor, bcolor);  //左
 8      ZhongZiTC4 (seedx, seedy+1, fcolor, bcolor);  //上
 9      ZhongZiTC4 (seedx, seedy–1, fcolor, bcolor);  //下
10      }
11 } 

UVA 572代码:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int maxn = 100+5;
 5 char deposits[maxn][maxn];
 6 int id[maxn][maxn];
 7 int rm,cm;
 8 void dfs(int r,int c,int cnt)
 9 {
10     ///判断是否出界
11     if(r<0 || r>=rm || c<0 || c>=cm) return;
12     ///临界条件
13     if(deposits[r][c] == ‘*‘) return;
14     if(id[r][c]) return;
15
16     id[r][c] = cnt;
17     for(int i=-1;i<=1;i++)
18         for(int j=-1;j<=1;j++)
19             if(i!=0 || j!=0) dfs(r+i,c+j,cnt);
20
21 }
22
23 int main()
24 {
25
26     while(cin>>rm>>cm && rm && cm)
27     {
28         for(int i=0;i<rm;i++) cin>>deposits[i];
29         int cnt=0;
30         memset(id,0,sizeof(id));
31         for(int i=0;i<rm;i++)
32             for(int j=0;j<cm;j++)
33             {
34                 if(!id[i][j] && deposits[i][j]==‘@‘)///没有编号
35                     dfs(i,j,++cnt);
36             }
37         cout<<cnt<<endl;
38
39     }
40     return 0;
41 }

原文地址:https://www.cnblogs.com/yxh-amysear/p/8450384.html

时间: 2024-10-24 08:24:07

UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)的相关文章

UVa 572 Oil Deposits(DFS求8连通块)

题意  求n*m矩阵中'@'连通块的个数  两个'@'在一个九宫格内就属于一个连通块 最基础的DFS  遇到@就递归扫描周围8个并标记当前格子已访问  然后就得到答案了 #include<cstdio> using namespace std; const int N = 110; char mat[N][N]; int dfs(int r, int c) { if(mat[r][c] != '@') return 0; else { mat[r][c] = '*'; for(int i =

UVa 572 油田(DFS求连通块)

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=513 终于开始接触图了,恩,开始接触DFS了,这道题就是求连通分量,比较简单. 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 int m, n; //记录连通块的数量 6 cha

UVa 572 Oil Deposits(DFS)

 Oil Deposits  The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots.

UVA 572 Oil Deposits油田(DFS求连通块)

UVA 572     DFS(floodfill)  用DFS求连通块 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M

油田(Oil Deposits)-用DFS求连通块

[本博文非博主原创,均摘自:刘汝佳<算法竞赛入门经典>(第2版) 6.4 图] [程序代码根据书中思路,非独立实现] 例题6-12 油田(Oil Deposits,UVa572) 输入一个m行n列的字符矩阵,统计字符"@"组成多少个八连块.如果两个字符"@"所在的格子相邻(横.纵或者对角线方向),就说它们属于一个八连块.例如,下图中有两个八连块. 一.分析 1.1 整体思路 图也有DFS和BFS遍历.由于DFS更容易编写,一般用DFS查找连通块:从每个&

UVA - 572 - Oil Deposits (图的DFS!)

UVA - 572 Oil Deposits Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description  Oil Deposits  The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works

DFS入门之二---DFS求连通块

用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所在位置相邻(上下左右对角共八个方位),则在一个连通块.典型例题:HDU 1241 Oil Deposits 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1241 题目描述:输入m行n列的字符矩阵, 统计字符“@”组成八连块的个数. 题意分析:读入数据

UVA 572 dfs求连通块

The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It then analyze

UVa572 Oil Deposits (DFS求连通块)

链接:http://acm.hust.edu.cn/vjudge/problem/19435分析:DFS求图的连通块.每次从图中找出一个未访问过的‘@’开始递归遍历它周围的‘@’格子,将访问到的‘@’标上id存在idx数组中,dfs的次数就是连通块的个数.DFS遍历用递归实现,BFS用队列实现.DFS和BFS实现种子填充:https://zh.wikipedia.org/wiki/Flood_fill 1 #include <cstdio> 2 #include <cstring>