油田”问题是一个比较经典的体现DFS思想的题目,经过学习,对DFS也有了一点理解,下面介绍下这个题目~

题目来源:

Mid-Central USA 1997,ZOJ1709,POJ1562

题目描述:

GeoSurvComp地质探测公司负责探测地下油田。每次GeoSurvComp公司都是在一块长方形的土地上来探测油田。在探测时,他们把这块土地用网格分成若干个小块,然后逐个分析每块土地,用探测设备探测地下是否有油田。土地底下有油田则成为pocket,如果两个pocket相邻,则认为是同一块油田,油田可能覆盖多个pocket。试计算长方形的土地上有多少个不同的油田。

输入描述:

输入文件中包含多个测试数据,每个测试数据描述了一个网格。每个网格数据的第1行为两个整数:m、n,分别表示网格的行和列;如果m=0,则表示输入结束,否则1<=m<=100,1<=n<=100。接下来有m行数据,每行数据有n个字符(不包括行结束符)。每个字符代表一个小方块,如果为“*”,则代表没有石油,如果为“@”,则代表有石油,是一个pocket。

输出描述:

对输入文件中的每个网格,输出网格中不同的油田数目。如果两块不同的pocket在水平、垂直或者对角线方向上相邻,则被认为属于同一块油田。每块油田所包含的pocket数目不会超过100。

样例输入:

5 5

****@

*@@*@

*@**@

@@@*@

@@**@

样例输出:

2

下面还是老套路,贴上源码+注释,希望能加深理解~

Code:

[cpp] view plaincopyprint?
  1. #include<iostream>
  2. using namespace std;
  3. char grid[101][101];    //网格
  4. int n, m;       //行、列
  5. //一个网格的8个方向
  6. int dir[8][2] = { {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} };
  7. //从(x,y)进行深度优先遍历
  8. void DFS(int x, int y)
  9. {
  10. int xx, yy;
  11. grid[x][y] = '*';       //将grid中访问过的方块设置成‘*’,防止重复访问~
  12. for(int i = 0; i < 8; i++)
  13. {
  14. xx = x + dir[i][0];
  15. yy = y + dir[i][1];
  16. if(xx<0 || xx>=n || yy<0 || yy>=m) continue;    //越界终止本次循环
  17. if(grid[xx][yy] == '@') DFS(xx, yy);            //如果方格还是‘@’,则继续搜索
  18. }
  19. }
  20. int main()
  21. {
  22. int i, j;   //循环变量
  23. int count;  //油田数量计数
  24. while(scanf("%d%d", &n, &m))
  25. {
  26. if(n == 0 && m == 0) break;
  27. count = 0;
  28. memset(grid, 0, sizeof(grid));
  29. for(i = 0; i < n; i++) scanf("%s", grid[i]);
  30. for(i = 0; i < n; i++)
  31. for(j = 0; j < m; j++)
  32. if(grid[i][j] == '@') { DFS(i, j); count++; }   //在(i,j)遍历,并且遍历了一个“油田”,计数器加1
  33. printf("%d\n", count);
  34. }
  35. return 0;
  36. }

运行结果:

Ps:如有bug,欢迎拍砖~

实现DFS之“油田”相关推荐

  1. UVa 352 - The Seasonal War ( DFS求连通块 )

    思路 基础DFS 和油田那题思路一毛一样 AC代码 #include <iostream> #include <cstdio> #include <cstring> ...

  2. poj1562-DFS

    如果想在DFS过程中计算油田个数会很麻烦,所以要简化思想.我们可以把每一个油田当成一次DFS(只对"@"的进行DFS,这样每当DFS退出时,表示一块油田搜索完毕 ),这样每次DFS ...

  3. 【DFS】【水】HDU1241 Oil Deposits 油田资源

    GeoSurvComp地质调查公司负责探测地下石油储藏. GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块.他们通过专业设备,来分析每个小块中是否蕴藏石油.如果这些蕴藏石 ...

  4. 杭电1241java实现dfs

    问题描述 GeoSurvComp地质调查公司负责检测地下油藏. GeoSurvComp一次与一个大的矩形区域一起工作,并创建一个网格,将网格划分为多个方块.然后分别分析每个地块,使用传感设备确定该地块 ...

  5. Uva572(DFS+联通集)

    题目地址 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=838& ...

  6. POJ 1562深搜判断连体油田个数

    http://poj.org/problem?id=1562 大意:输入mp二维矩阵,规定'@'连体的包括对角线为一片油田,统计共有多少油田.深搜方向数组dir设置8个方向遇到@继续搜索把当前位置赋值 ...

  7. DFS实现floodfill算法

    题目: 分析与解答 题目: 多组案例,每组案例输入一个m行n列的字符矩阵,统计字符'@'组成多少个连通块.如果两个字符'@'所在的格子相邻(横.竖或对角线),则说明它们属于同一连通块. Sample ...

  8. Oil Deposits(油田问题)

    题意:找出地图上的油层数,每个油层由多个油藏组成,这些油藏相邻,常规的搜索问题,每次向八个方向搜寻油藏. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid= ...

  9. DFS(深度优先搜索算法)

    基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜 ...

最新文章

  1. joda time, jackson 与 scala 反射
  2. 100题_22 整数的二进制表示中1的个数
  3. 8.公有继承 保护继承 私有继承
  4. shell 删除奇数偶数行
  5. AJAX DELETE
  6. python实例讲解wxpythonhyh123_Python实例讲解 -- wxpython 基本的控件 (按钮)
  7. android 字符串对齐,android – 使用Spanable String对齐ImageSpan
  8. 【共读Primer】52.[6.3]返回类型和return语句--返回数组指针 Page205
  9. sql 过滤空值_图解 SQL,这简直太形象了吧!
  10. app流量相对专项测试(待续)
  11. 安装tif虚拟打印机
  12. 瑞昱rtl8197fs芯片怎么样_拆开外表看内在 篇二:设计精美,做工优秀却无自研芯片——荣耀路由器2拆解评测...
  13. php全站文章搜索,phpspider在列表页生成内容采集url.(又名:如何通过搜狗搜索关键词,爬取新浪新闻)...
  14. win7此计算机无法加入家庭组,Win7系统无法加入家庭组问题的解决方法
  15. C语言编程-随机步法的实现
  16. 从零搭建开发脚手架 Spring Boot集成Mybatis-plus之一
  17. 矩阵分析:Kronecker积,Hadamard积
  18. 小秘谈币:炒币资深玩家所遇到的交易恐惧
  19. Cesium中的相机—HeadingPitchRoll
  20. 【转】反调试技巧总结-原理和实现

热门文章

  1. 【Android 应用开发】Android 杀进程总结 ( 杀后台进程 | 杀前台进程 | 杀其它进程 )
  2. 【鸿蒙 HarmonyOS】UI 组件 ( Button 组件 )
  3. 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 2 | 扩展到整数解 )
  4. 【Android 电量优化】电量优化 ( 网络状态获取 | 主动获取 WIFI 状态 | 被动获取 WIFI 状态 )
  5. 【Java 网络编程】TCP 简介
  6. 【C++ 语言】 C 与 C++ 兼容 ( extern C )
  7. 关于Linux服务器配置java环境遇到的问题
  8. (数论)51NOD 1135 原根
  9. redis持久化的几种方式
  10. 【java排序】 归并排序算法、堆排序算法