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 char a[10000][10000];
 7 int  b[10000][10000];
 8
 9 void DFS(int i, int j, int count)
10 {
11     if (i < 0 || i >= m || j < 0 || j >= n) return;     //在递归时出界的情况
12         if(b[i][j]>0 || a[i][j]!=‘@‘)  return;
13     b[i][j] = count;
14     for (int p = -1; p <= 1; p++)
15     {
16         for (int q = -1; q <= 1; q++)
17         {
18             if (p != 0||q != 0)  DFS(i + p, j + q, count);
19         }
20     }
21 }
22
23 int main()
24 {
25     while (cin >> m >> n && m && n)
26     {
27         for (int i = 0; i < m; i++)
28             scanf("%s", &a[i]);
29         int count = 0;
30         memset(b, 0, sizeof(b));
31         for (int i = 0; i < m; i++)
32         {
33             for (int j = 0; j < n; j++)
34             {
35                 if (b[i][j] == 0 && a[i][j]==‘@‘) DFS(i, j, ++count);
36             }
37         }
38         cout << count << endl;
39     }
40     return 0;
41 }

2016-12-03  07:49:56

时间: 2024-08-12 11:41:04

UVa 572 油田(DFS求连通块)的相关文章

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

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

UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常量数组或者写8条DFS调用. 下述算法是:种子填充(floodfill) 两种连通区域 四连通区域:从区域内一点出发,可通过上.下.左.右四个方向的移动组合,在不越出区域的前提下,能到达区域内的任意像素 八连通区域:从区域内每一像素出发,可通过八个方向,即上.下.左.右.左上.右上.左下.右下移动的

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

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

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

用DFS求连通块(种子填充)

[问题] 输入一个m行n列的字符矩阵,统计字符"@"组成多少个八连块.如果两个字符"@"所在的格子相邻(横.竖或者对角线方向),就说它们属于同一个八连块.例如,图6-9中有两个八连块. 图6-9 [分析] 和前面的二叉树遍历类似,图也有DFS和BFS遍历.由于DFS更容易编写,一般用DFS找连通块:从每个"@"格子出发,递归遍历它周围的"@"格子.每次访问一个格子时就给它写上一个"连通分量编号"(即下面代码

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>

uva 11853 Paintball dfs找连通块

题意: 给出一个矩形湖, 湖里面有一些圆形地小岛, 问能否从左岸乘船到达右岸,如果能,找出最上面的起点和终点. 题解: 如果能从左岸到达右岸,那么一定不能存在一个连通的岛屿从上岸连到下岸, 所以直接从上到下做dfs,判断是否存在从上岸到下岸地连通块,完成判断.那么接下来就是如何找出最上方地点了,画画图便发现,对于起点,如果存在跨越上岸和左岸地连通岛屿,那么起点一定只能在左岸地交点下方,所以,只需在dfs的过程中更新起点和终点位置即可. 代码: #include <queue> #include

hdu 1241 Oil Deposits(DFS求连通块)

HDU 1241  Oil Deposits L -DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Description The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rec