[本博文非博主原创,均摘自:刘汝佳《算法竞赛入门经典》(第2版) 6.4 图]

[程序代码根据书中思路,非独立实现]

例题6-12 油田(Oil Deposits,UVa572)

  输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、纵或者对角线方向),就说它们属于一个八连块。例如,下图中有两个八连块。

一、分析

  1.1 整体思路

  图也有DFS和BFS遍历。由于DFS更容易编写,一般用DFS查找连通块:从每个"@"格子出发,递归遍历它周围的"@"格子。每次访问一个格子时,就给它写上一个"连通分量编号",这样就可以在访问之前检查它是否已经有了编号,从而避免同一个格子访问多次。

  1.2 各坐标的邻接位置(3X3)扫描器

二、程序实现

//用DFS求连通块
#include<iostream>
#include<string.h>
using namespace std; const int maxn = ;
int cnt;
int *cntArray;
char matrix[maxn][maxn];
int idx[maxn][maxn];//标记数组
int m;
int n; void print(int rows, int cols){
for(int i=;i<rows;i++){
for(int j=;j<cols;j++){
printf("%d\t", idx[i][j]);
}
printf("\n");
}
} void dfs(int row,int col,int id){
if(row< || row>=m || col < || col >=n)
return;//边界
if((matrix[row][col] != '@') || (idx[row][col] > ))//已被标记或者不是@区域
return;
idx[row][col] = id;
for(int drow=-;drow<;drow++){//(邻接)扫描器
for(int dcol=-;dcol<;dcol++){
dfs(row + drow, col + dcol, id);
}
}
} int countIdx(){
cntArray = new int[cnt+];
memset(cntArray, , sizeof(cntArray));
int cursor = ;
for(int i=;i<m;i++){
for(int j=;j<n;j++){
cursor = matrix[i][j];
cntArray[cursor]++;
}
}
} int main(){
while(scanf("%d %d", &m, &n) == && m && n){
for(int i=;i<m;i++){
scanf("%s", matrix[i]);
}
memset(idx, , sizeof(idx));
int cnt = ;
for(int i=;i<m;i++){
for(int j=;j<n;j++){
if(idx[i][j] == && matrix[i][j] == '@')
dfs(i, j, ++cnt);
}
}
print(m, n);
}
return ;
}
/*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
*/

效果图:

三、参考文献

  1.刘汝佳.算法竞赛入门经典

[C++]油田(Oil Deposits)-用DFS求连通块的更多相关文章

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

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

  2. hdu 1241 Oil Deposits(DFS求连通块)

    HDU 1241  Oil Deposits L -DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & ...

  3. ZOJ 1709 Oil Deposits(dfs,连通块个数)

    Oil Deposits Time Limit: 2 Seconds      Memory Limit: 65536 KB The GeoSurvComp geologic survey compa ...

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

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

  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入门之二---DFS求连通块

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

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

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

  9. UVa572 Oil Deposits DFS求连通块

      技巧:遍历8个方向 ; dr <= ; dr++) ; dc <= ; dc++) || dc != ) dfs(r+dr, c+dc, id); 我的解法: #include< ...

随机推荐

  1. Codeforces Round #487 (Div. 2) C - A Mist of Florescence

    C - A Mist of Florescence 把50*50的矩形拆成4块 #include<bits/stdc++.h> using namespace std; ],b[]; ][ ...

  2. SQL中 like 通配符 特殊字符处理

    以下是一些匹配的举例,需要说明的是,只有like操作才有这些特殊字符,=操作是没有的.a_b... a[_]b%a%b... a[%]b%a[b... a[[]b%a]b... a]b%a[]b... ...

  3. 斯坦福大学公开课机器学习:machine learning system design | trading off precision and recall(F score公式的提出:学习算法中如何平衡(取舍)查准率和召回率的数值)

    一般来说,召回率和查准率的关系如下:1.如果需要很高的置信度的话,查准率会很高,相应的召回率很低:2.如果需要避免假阴性的话,召回率会很高,查准率会很低.下图右边显示的是召回率和查准率在一个学习算法中 ...

  4. linux 系统调用之文件操作

    fcntl 文件控制 open 打开文件 creat 创建新文件 close 关闭文件描述字 read 读文件 write 写文件 readv 从文件读入数据到缓冲数组中 writev 将缓冲数组里的 ...

  5. Codeforces Round #523 (Div. 2)

    Codeforces Round #523 (Div. 2) 题目一览表 来源 考察知识点 完成时间 A Coins cf 贪心(签到题) 2018.11.23 B Views Matter cf 思 ...

  6. JS模块化开发(三)——seaJs+grunt

    1.seaJs直接构建存在的问题 由于模块之间的依赖require引用的是模块名,当多个js模块被合并成一个时,会由于找不到模块名而报错 2.seaJs+grunt开发 用到的插件:grunt-cmd ...

  7. c#中序列化和反序列化的理解

    using System.IO;using System.Runtime.Serialization.Formatters.Binary; 序列化:对象转化为文件的过程(字节流) 反序列化:文件(字节 ...

  8. Excel:11个查询函数组合

    还不懂?上栗子~ 1.普通查找 根据表二中的姓名,查找表一对应的应发工资.最基础的VLOOKUP函数就能搞定. 2.反向查找 根据表二姓名,查找表一编号.但表一中编号列在姓名列之前,无法直接使用VLO ...

  9. angular中因异步问题产生的错误解决方法

    方法一 private userTaskList(){ let auth = this.make_basic_auth("kermit","kermit"); ...

  10. 2018 CCPC-FINAL 后记

    赛前认为这将会是我生涯最接近铁牌的一场比赛,遗憾的是没有抓住机会,又打了个铜出来. 6题可做题,去掉签到4道数学题可把我无聊坏了,幸好主办方出了个算法题给我自娱自乐了几个小时. Day1热身赛,贪心, ...