用DFS求连通块(种子填充)
【问题】
输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在
的格子相邻(横、竖或者对角线方向),就说它们属于同一个八连块。例如,图6-9中有两
个八连块。

图6-9
【分析】
和前面的二叉树遍历类似,图也有DFS和BFS遍历。由于DFS更容易编写,一般用DFS找
连通块:从每个“@”格子出发,递归遍历它周围的“@”格子。每次访问一个格子时就给它写
上一个“连通分量编号”(即下面代码中的idx数组),这样就可以在访问之前检查它是否已经
有了编号,从而避免同一个格子访问多次
#include<cstdio>
#include<cstring>
const int maxn = + ;
char pic[maxn][maxn];
int m, n, idx[maxn][maxn];
void dfs(int r, int c, int id) {
if(r < || r >= m || c < || c >= n) return; //"出界"的格子
if(idx[r][c] > || pic[r][c] != '@') return; //不是"@"或者已经访问过的格子
idx[r][c] = id; //连通分量编号 //接收主函数传过来的格子
//从这个格子出发递归向八个方向走
//走完以后cnt++,表示这是一个连通量 for(int dr = -; dr <= ; dr++)
for(int dc = -; dc <= ; dc++)
if(dr != || dc != ) dfs(r+dr, c+dc, id);
}
int main( ) {
while(scanf("%d%d", &m, &n) == && m && n) {
for(int i = ; i < m; i++) scanf("%s", pic[i]);
memset(idx, , sizeof(idx));
int cnt = ;
for(int i = ; i < m; i++)
for(int j = ; j < n; j++)
if(idx[i][j] == && pic[i][j] == '@') dfs(i, j, ++cnt);
printf("%d\n", cnt);
}
return ;
}
摘自算法竞赛入门-刘汝佳
用DFS求连通块(种子填充)的更多相关文章
- UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)
UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常 ...
- DFS入门之二---DFS求连通块
用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所 ...
- 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) 输入一个 ...
- 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求连通块(漫水填充法)
G - DFS(floodfill),推荐 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I6 ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- UVa 572 油田(DFS求连通块)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- OA系统开发人事模块关于请假跨月的处理
前言:其实对于跨月的数据单独处理是不难的,但是对于后台显示页面,肯定不是单纯拼接一个where条件的,因此在我的项目也是如此,并不能够用普遍的方法来处理,此时就想尽量用简单的方法来处理跨月数据的准确性 ...
- php操作excel表格的导入和导出
前言:对于excel大家肯定熟悉不过了的,那么我们在日常的业务中应该是有对这些文件的导入导出操作的 类的下载:composer require phpoffice/phpexcel,其中Classes ...
- avg 的使用
select * from emp where sal>(select avg(sal) as ssalfrom emp);--要求查询出高于公司平均工资的全部雇员信息
- JavaScript在div后添加删除div
var idd = 'str'; $('.task-done-detail-content-p7').click(function () { var id = this.id; if(idd !== ...
- es6常用语法学习笔记
1.let和const的常规使用 let声明的变量不存在预解析 let声明的变量不允许重复使用(在同一个作用域内) ES6引入了块级作用域{},块内部定义的变量,在外部是不可以访问到的 使用let在f ...
- Lambda表达式与函数式接口
Lambda表达式的类型,也被称为目标类型(targer type),Lambda表达式的目标类型必须是"函数式接口(functional interface)".函数式接口代表只 ...
- mysql定时器设置开机默认自启动
1).查询mysql安装位置:show variables like "%char%"; 2).查询定时器是否开启: -查询定时器状态:show VARIABLES LIKE '% ...
- GitHub:本地项目上传与团队协作
第一部分:我的本次作业成果 我自己个人的github地址是:colintz的个人仓库 我们开发团队小组的github地址是:小组3集中营 第二部分:强烈推荐的github资源 对于和我一样,初次接触g ...
- egret中三种单利的写法。
1 普通的单例写法 缺点:每个单例类里都要写instance和getInstance. class Single{ private static instance:Single; public sta ...
- 论文翻译:BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or −1
目录 摘要 引言 1.BinaryNet 符号函数 梯度计算和累积 通过离散化传播梯度 一些有用的成分 算法1 使用BinaryNet训练DNN 算法2 批量标准化转换(Ioffe和Szegedy,2 ...