[本博文非博主原创,均摘自:刘汝佳《算法竞赛入门经典》(第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. OpenLayers学习笔记(七)— 类似比例尺的距离环(一)

    openlayers 3 地图上创建一个距离环,始终以地图中心为中心,每个环之间的距离类似比例尺,随地图缩放而变化. 添加具有覆盖整个范围的特征的虚拟层,其可以被设置为围绕地图中心的环.注意,根据地图 ...

  2. Qt5应用改变窗口大小时出现黑影

    解决方法 在启动程序时,添加-platform wayland参数 添加QT_QPA_PLATFORM=wayland-egl到系统环境变量 注意:改完后虽然没有黑影,但软件图标显示不正常,也不能正常 ...

  3. [BJOI2017]开车

    [BJOI2017]开车 直接做要用栈 修改?难以直接维护 统计边的贡献! len*abs(pre)pre表示前缀car-stop 修改时候,整个区间的pre+1或者-1 分块,块内对pre排序并打标 ...

  4. 【模板】ac自动机

    本来是真的特别不想写这个的 但是有段时间洛谷天天智推这个可能是我太菜了 然后觉得这个也不难 乘着今早没事写下 来这保存下 方便下次食用 #include <bits/stdc++.h> u ...

  5. 将pandas的Dataframe对象读写Excel文件

    Dataframe对象生成Excel文件 需要xlrd库  命令  pip install xlrd #导入pandas import pandas as pd import numpy as np ...

  6. 我的winows server 2012 突然多了个piress的帐户,后来一查原来是mysql漏洞的问题,郁闷

    今天打开远程连接到windows server 2012,服务器上装的360竟然提示有木马.吓了一跳.再检查计算机账户,多了个piress账户.把这个账户在百度一搜索,原来还有其它人中招. 后来发现网 ...

  7. jdk1.8的新特性:很全面

    JDK1.8: https://www.cnblogs.com/tiantianbyconan/p/3613506.html stream的几个方法: filter: 过滤条件 过滤为空的方法: 刚好 ...

  8. 线程(Thread)

    package cn.gouzao.demo3; public class ThreadDemo extends Thread{ public void run(){ for(int i=0;i< ...

  9. WCF博文链接

    我的基于WCF的SOA架构项目实战 http://www.uml.org.cn/soa/201112201.asp WCF实战(一):创建服务器类 https://blog.csdn.net/qium ...

  10. linux 优化(一)

    uptime up 表示系统正在运行 10:54:19 表示当前时间 8 min 表示系统启动的总时间 1 user 表示正在登陆用户数 load average 表示系统平均负载,最后三个数字呢,依 ...