实现DFS之“油田”
油田”问题是一个比较经典的体现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:
- #include<iostream>
- using namespace std;
- char grid[101][101]; //网格
- int n, m; //行、列
- //一个网格的8个方向
- int dir[8][2] = { {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} };
- //从(x,y)进行深度优先遍历
- void DFS(int x, int y)
- {
- int xx, yy;
- grid[x][y] = '*'; //将grid中访问过的方块设置成‘*’,防止重复访问~
- for(int i = 0; i < 8; i++)
- {
- xx = x + dir[i][0];
- yy = y + dir[i][1];
- if(xx<0 || xx>=n || yy<0 || yy>=m) continue; //越界终止本次循环
- if(grid[xx][yy] == '@') DFS(xx, yy); //如果方格还是‘@’,则继续搜索
- }
- }
- int main()
- {
- int i, j; //循环变量
- int count; //油田数量计数
- while(scanf("%d%d", &n, &m))
- {
- if(n == 0 && m == 0) break;
- count = 0;
- memset(grid, 0, sizeof(grid));
- for(i = 0; i < n; i++) scanf("%s", grid[i]);
- for(i = 0; i < n; i++)
- for(j = 0; j < m; j++)
- if(grid[i][j] == '@') { DFS(i, j); count++; } //在(i,j)遍历,并且遍历了一个“油田”,计数器加1
- printf("%d\n", count);
- }
- return 0;
- }
运行结果:
Ps:如有bug,欢迎拍砖~
实现DFS之“油田”相关推荐
- UVa 352 - The Seasonal War ( DFS求连通块 )
思路 基础DFS 和油田那题思路一毛一样 AC代码 #include <iostream> #include <cstdio> #include <cstring> ...
- poj1562-DFS
如果想在DFS过程中计算油田个数会很麻烦,所以要简化思想.我们可以把每一个油田当成一次DFS(只对"@"的进行DFS,这样每当DFS退出时,表示一块油田搜索完毕 ),这样每次DFS ...
- 【DFS】【水】HDU1241 Oil Deposits 油田资源
GeoSurvComp地质调查公司负责探测地下石油储藏. GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块.他们通过专业设备,来分析每个小块中是否蕴藏石油.如果这些蕴藏石 ...
- 杭电1241java实现dfs
问题描述 GeoSurvComp地质调查公司负责检测地下油藏. GeoSurvComp一次与一个大的矩形区域一起工作,并创建一个网格,将网格划分为多个方块.然后分别分析每个地块,使用传感设备确定该地块 ...
- Uva572(DFS+联通集)
题目地址 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=838& ...
- POJ 1562深搜判断连体油田个数
http://poj.org/problem?id=1562 大意:输入mp二维矩阵,规定'@'连体的包括对角线为一片油田,统计共有多少油田.深搜方向数组dir设置8个方向遇到@继续搜索把当前位置赋值 ...
- DFS实现floodfill算法
题目: 分析与解答 题目: 多组案例,每组案例输入一个m行n列的字符矩阵,统计字符'@'组成多少个连通块.如果两个字符'@'所在的格子相邻(横.竖或对角线),则说明它们属于同一连通块. Sample ...
- Oil Deposits(油田问题)
题意:找出地图上的油层数,每个油层由多个油藏组成,这些油藏相邻,常规的搜索问题,每次向八个方向搜寻油藏. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid= ...
- DFS(深度优先搜索算法)
基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜 ...
最新文章
- joda time, jackson 与 scala 反射
- 100题_22 整数的二进制表示中1的个数
- 8.公有继承 保护继承 私有继承
- shell 删除奇数偶数行
- AJAX DELETE
- python实例讲解wxpythonhyh123_Python实例讲解 -- wxpython 基本的控件 (按钮)
- android 字符串对齐,android – 使用Spanable String对齐ImageSpan
- 【共读Primer】52.[6.3]返回类型和return语句--返回数组指针 Page205
- sql 过滤空值_图解 SQL,这简直太形象了吧!
- app流量相对专项测试(待续)
- 安装tif虚拟打印机
- 瑞昱rtl8197fs芯片怎么样_拆开外表看内在 篇二:设计精美,做工优秀却无自研芯片——荣耀路由器2拆解评测...
- php全站文章搜索,phpspider在列表页生成内容采集url.(又名:如何通过搜狗搜索关键词,爬取新浪新闻)...
- win7此计算机无法加入家庭组,Win7系统无法加入家庭组问题的解决方法
- C语言编程-随机步法的实现
- 从零搭建开发脚手架 Spring Boot集成Mybatis-plus之一
- 矩阵分析:Kronecker积,Hadamard积
- 小秘谈币:炒币资深玩家所遇到的交易恐惧
- Cesium中的相机—HeadingPitchRoll
- 【转】反调试技巧总结-原理和实现
热门文章
- 【Android 应用开发】Android 杀进程总结 ( 杀后台进程 | 杀前台进程 | 杀其它进程 )
- 【鸿蒙 HarmonyOS】UI 组件 ( Button 组件 )
- 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 2 | 扩展到整数解 )
- 【Android 电量优化】电量优化 ( 网络状态获取 | 主动获取 WIFI 状态 | 被动获取 WIFI 状态 )
- 【Java 网络编程】TCP 简介
- 【C++ 语言】 C 与 C++ 兼容 ( extern C )
- 关于Linux服务器配置java环境遇到的问题
- (数论)51NOD 1135 原根
- redis持久化的几种方式
- 【java排序】 归并排序算法、堆排序算法