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

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

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

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

一、分析

  1.1 整体思路

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

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

二、程序实现

  1. //用DFS求连通块
  2. #include<iostream>
  3. #include<string.h>
  4. using namespace std;
  5.  
  6. const int maxn = ;
  7. int cnt;
  8. int *cntArray;
  9. char matrix[maxn][maxn];
  10. int idx[maxn][maxn];//标记数组
  11. int m;
  12. int n;
  13.  
  14. void print(int rows, int cols){
  15. for(int i=;i<rows;i++){
  16. for(int j=;j<cols;j++){
  17. printf("%d\t", idx[i][j]);
  18. }
  19. printf("\n");
  20. }
  21. }
  22.  
  23. void dfs(int row,int col,int id){
  24. if(row< || row>=m || col < || col >=n)
  25. return;//边界
  26. if((matrix[row][col] != '@') || (idx[row][col] > ))//已被标记或者不是@区域
  27. return;
  28. idx[row][col] = id;
  29. for(int drow=-;drow<;drow++){//(邻接)扫描器
  30. for(int dcol=-;dcol<;dcol++){
  31. dfs(row + drow, col + dcol, id);
  32. }
  33. }
  34. }
  35.  
  36. int countIdx(){
  37. cntArray = new int[cnt+];
  38. memset(cntArray, , sizeof(cntArray));
  39. int cursor = ;
  40. for(int i=;i<m;i++){
  41. for(int j=;j<n;j++){
  42. cursor = matrix[i][j];
  43. cntArray[cursor]++;
  44. }
  45. }
  46. }
  47.  
  48. int main(){
  49. while(scanf("%d %d", &m, &n) == && m && n){
  50. for(int i=;i<m;i++){
  51. scanf("%s", matrix[i]);
  52. }
  53. memset(idx, , sizeof(idx));
  54. int cnt = ;
  55. for(int i=;i<m;i++){
  56. for(int j=;j<n;j++){
  57. if(idx[i][j] == && matrix[i][j] == '@')
  58. dfs(i, j, ++cnt);
  59. }
  60. }
  61. print(m, n);
  62. }
  63. return ;
  64. }
  65. /*
  66. 5 5
  67. ****@
  68. *@@*@
  69. *@**@
  70. @@@*@
  71. @@**@
  72. */

效果图:

三、参考文献

  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. 【转】MySQL常见错误代码及代码说明参考

    Mariadb文档:https://mariadb.com/kb/zh-cn/mariadb/ MySQL文档:https://dev.mysql.com/doc/refman/8.0/en/ 100 ...

  2. MySQL 到底能不能放到 Docker 里跑?

    https://weibo.com/ttarticle/p/show?id=2309404296528549285581 前言 前几月经常看到有 MySQL 到底能不能放到 Docker 里跑的各种讨 ...

  3. 第一次有人把5G讲的这么简单明了

    第一次有人把5G讲的这么简单明了 鲜枣课堂 纯洁的微笑 今天 关于5G通信,常见的文章都讲的晦涩难懂,不忍往下看,特转载一篇,用大白话实现5G入门. 简单说,5G就是第五代通信技术,主要特点是波长为毫 ...

  4. kafka 流式计算

    http://www.infoq.com/cn/articles/kafka-analysis-part-7/ Kafka设计解析(七)- 流式计算的新贵 Kafka Stream

  5. js 调试技巧

    快捷键 1.快速查看HTML中dom元素绑定那些JS事件方法 chrome中      F12-->Elements-->Event Listenners 参考:https://jingy ...

  6. Nginx概述及安装配置

    1.概述 Nginx是一款开源的,高性能的Http和反向代理服务器,同时也是一个IMAP.POP3.SMTP代理服务器:Nginx可以作为一个HTTP服务器进行网站的发布处理,也可以作为反向代理进行负 ...

  7. 第三十一篇-TextInputLayout(增强文本输入)的使用

    效果图: 密码使用的是增强文本输入类型,当密码长度小于6或者密码长度大于10的时候就会给出提示. main.xml 当添加TextInputLayout时,旁边会有一个下载符号,如果点不动,可以右键点 ...

  8. 第一节,初识OpenCV3-图像的读、写、显、格式转化等

    之前一直在看深度学习,突然用到了对图像处理的东西,所以过来补充一下OpenCV基础. 就顺便从网上了买了一本OpenCV 3计算机视觉这本书,这本书比较薄,但是目前已经够我用了,在这里就记录一下我的学 ...

  9. shell脚本[] [[]] -n -z 的含义解析

    1.在中括号中,判断变量的值, 加不加双引号的问题?-z 判断 变量的值,是否为空: zero = 0 - 变量的值,为空,返回0,为true- 变量的值,非空,返回1,为false-n 判断变量的值 ...

  10. C# WebApi过滤器(开发接口必备利器)

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...