【问题】

输入一个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求连通块(种子填充)的更多相关文章

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

    UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常 ...

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

    用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所 ...

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

    UVA 572     DFS(floodfill)  用DFS求连通块 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format: ...

  4. [C++]油田(Oil Deposits)-用DFS求连通块

    [本博文非博主原创,均摘自:刘汝佳<算法竞赛入门经典>(第2版) 6.4 图] [程序代码根据书中思路,非独立实现] 例题6-12 油田(Oil Deposits,UVa572) 输入一个 ...

  5. HDU1241 Oil Deposits —— DFS求连通块

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241 Oil Deposits Time Limit: 2000/1000 MS (Java/Othe ...

  6. UVA 572 dfs求连通块

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...

  7. DFS求连通块(漫水填充法)

    G - DFS(floodfill),推荐 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I6 ...

  8. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

  9. UVa 572 油田(DFS求连通块)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

随机推荐

  1. work behind corp proxy

    =================================proxy 的写法=================================一般写法是: http://my.proxy.ad ...

  2. vmware彻底隐藏控制栏白条

    vmware全屏模式都会在屏幕顶端留一条细细的条. 选择查看,里面有个独占模式.选中该模式,就可以达到完全全屏的效果. 但是进入独占模式后,无法再在多个系统间来回切换,使用ctrl+alt可以切换回正 ...

  3. Linux VPS通过安装CPULimit来限制CPU使用率

    说明:我们手上经常有很多廉价的VPS,有时候使用某些软件应用的时候,会出现CPU跑满的情况,而长时间跑满会被VPS商家停掉,所以这里我们需要想办法来限制进程CPU使用率,这里就说个教程. 简介 cpu ...

  4. R语言数据集的技术

    特征值选择技术要点 特征值选择技术要点(特征值分解) 作者:王立敏 文章来源:xiahouzuoxin 一.特征值分解 1.特征值分解 线性代数中,特征分解(Eigendecomposition),又 ...

  5. 中国 A 股纳入 MSCI

    1 .什么是 MSCI MSCI 是美国指数编制公司 --- 美国明晟公司的简称. 是一家股权,固定资产,对冲基金,股票市场指数的供应商. MSCI 旗下编制了多种指数,他们把全球股票市场分成发达国家 ...

  6. 前端node.js npm i 报错Unexpected end of JSON input while parsing near

    清缓存 npm cache clean --force 重新安装 npm install

  7. 记事本:js简介

    引用js和css很类似,大致有三种方式: 第一种: 在行内引用js, <div onclick="alert(111);"> </div> 第二种: 在行外 ...

  8. 迁移虚拟机打开快照报错:CPUID错误

    场景:迁移虚拟机后,恢复快照报错 这个没办法解决,正常启动不会报错,恢复快照有可能报错,是因为你的cpu与快照那个cpu不匹配造成的

  9. 用户态与内核态 & 文件流与文件描述符 简介【转】

    转自:https://www.cnblogs.com/Jimmy1988/p/7479856.html 用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平 ...

  10. .bat以管理员身份运行

    原文地址:https://blog.csdn.net/stranger_hello/article/details/82257947 @echo off :获取管理员权限 %1 mshta vbscr ...