HDOJ(HDU).1241 Oil Deposits(DFS) [从零开始DFS(5)]

点我挑战题目

从零开始DFS

HDOJ.1342 Lotto [从零开始DFS(0)] — DFS思想与框架/双重DFS

HDOJ.1010 Tempter of the Bone [从零开始DFS(1)] —DFS四向搜索/奇偶剪枝

HDOJ(HDU).1015 Safecracker [从零开始DFS(2)] —DFS四向搜索变种

HDOJ(HDU).1016 Prime Ring Problem (DFS) [从零开始DFS(3)] —小结:做DFS题目的关注点

HDOJ(HDU).1035 Robot Motion [从零开始DFS(4)]—DFS题目练习

HDOJ(HDU).1241 Oil Deposits(DFS) [从零开始DFS(5)] —DFS八向搜索/双重for循环遍历

HDOJ(HDU).1258 Sum It Up (DFS) [从零开始DFS(6)] —DFS双重搜索/去重技巧

HDOJ(HDU).1045 Fire Net [从零开始DFS(7)]—DFS练习/check函数的思想

题意分析

给出地图规模n * m,地图中 *(星号)代表空白, @ 代表油田。一群@联通在一起称为油田块(此处的联通为八方向联通)。求地图中油田块的个数。

分析:

既然是求解油田块的个数,自然先想到的办法就是先处理一个油田块,然后处理下一个油田块……然后依次计数油田块的个数,也就是每次处理一个油田块的时候+1。我们按照这种方法来实现。

与之前的选数字,或者是给出指定入口求解是否能走地图的题目不同。本题需要全部遍历地图,也就是说需要一个一个格子来遍历地图,采用双重的for循环来实现。试想一下:当某一个格子是@时候,我们就从这个格子开始进行dfs,dfs的目的是处理掉与@相连的所有的@,于此同时计数+1。处理完成后,找到下一个是@的格子,再处理掉与此相连的@,计数+1。如此往复,直到处理完整个地图,搜索结束。

那么不难看出,递归边界就是:这个格子在地图外边。进行递归的条件是:当且仅当这个格子是@并且还没有访问过

还有一点别忘记,此题判定@@相邻的条件是八向联通 也就是左上左下右上右下相邻也算联通,所以此题是八向搜素。

(可参见四向搜索的例题 HDOJ.1010 Tempter of the Bone [从零开始DFS(1)]

上代码!

代码总览

/*
Title:HDOJ.1241
Author:pengwill
Date:2017-2-8
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m,visit[105][105],cnt;
char mp[105][105];
int spx[] = {0,1,0,-1,1,1,-1,-1};
int spy[] = {1,0,-1,0,-1,1,1,-1};
bool check(int x, int y)
{
if(x<0 || x>=n || y<0 || y>=m) return false;
else return true;
}
void dfs(int x , int y)
{
if(!check(x,y)) return;//发生越界的时候,终止递归
visit[x][y] = 1;
for(int i = 0;i <8 ;++i){
int nx = x+ spx[i];
int ny = y +spy[i];
if(visit[nx][ny] == 0 && mp[nx][ny] =='@')//当且仅当格子是@并且没有访问过
dfs(nx,ny);
}
}
int main()
{
while(scanf("%d%d",&n,&m) && n){
for(int i = 0; i<n;++i)
scanf("%s",mp[i]);
cnt = 0;
memset(visit,0,sizeof(visit));
for(int i = 0;i <n; ++i){//采用双重for循环遍历整个地图
for(int j =0; j<m; ++j){
if(!visit[i][j]&&mp[i][j] == '@'){//当且仅当格子是@并且没有访问过
cnt++;
dfs(i,j);
}
}
}
printf("%d\n",cnt);
}
return 0;
}

此题思路的实现就在于双重for循环代表遍历整个地图;

        for(int i = 0;i <n; ++i){
for(int j =0; j<m; ++j){
if(!visit[i][j]&&mp[i][j] == '@'){
cnt++;
dfs(i,j);
}
}
}

与之前的选数字的一个for循环有异曲同工之妙。

HDOJ(HDU).1241 Oil Deposits(DFS)的更多相关文章

  1. HDOJ/HDU 1241 Oil Deposits(经典DFS)

    Problem Description The GeoSurvComp geologic survey company is responsible for detecting underground ...

  2. HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  3. HDU 1241 Oil Deposits (DFS/BFS)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  4. HDU 1241 Oil Deposits (DFS or BFS)

    链接 : Here! 思路 : 搜索判断连通块个数, 所以 $DFS$ 或则 $BFS$ 都行喽...., 首先记录一下整个地图中所有$Oil$的个数, 然后遍历整个地图, 从油田开始搜索它所能连通多 ...

  5. HDU 1241 Oil Deposits DFS搜索题

    题目大意:给你一个m*n的矩阵,里面有两种符号,一种是 @ 表示这个位置有油田,另一种是 * 表示这个位置没有油田,现在规定相邻的任意块油田只算一块油田,这里的相邻包括上下左右以及斜的的四个方向相邻的 ...

  6. HDU 1241 Oil Deposits --- 入门DFS

    HDU 1241 题目大意:给定一块油田,求其连通块的数目.上下左右斜对角相邻的@属于同一个连通块. 解题思路:对每一个@进行dfs遍历并标记访问状态,一次dfs可以访问一个连通块,最后统计数量. / ...

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

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

  8. DFS(连通块) HDU 1241 Oil Deposits

    题目传送门 /* DFS:油田问题,一道经典的DFS求连通块.当初的难题,现在看上去不过如此啊 */ /************************************************ ...

  9. HDU 1241 Oil Deposits(石油储藏)

    HDU 1241 Oil Deposits(石油储藏) 00 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)   Probl ...

随机推荐

  1. Python全栈 MongoDB 数据库(Mongo、 正则基础、一篇通)

                  终端命令:       在线安装:         sudo apt-get install mongodb         默认安装路径 :  /var/lib/mong ...

  2. yii的学习笔记 基本结构 自用

    Yii 学习笔记 W:YII是什么? Q:Yii 是一个基于组件的高性能 PHP 框架,用于快速开发大型 Web 应用.它使Web开发中的 可复用度最大化,可以显著提高你的Web应用开发速度.Yii ...

  3. lintcode702 连接两个字符串中的不同字符

    连接两个字符串中的不同字符   给出两个字符串, 你需要修改第一个字符串,将所有与第二个字符串中相同的字符删除, 并且第二个字符串中不同的字符与第一个字符串的不同字符连接 思路:遍历两个字符串,找到互 ...

  4. lintcode433 岛屿的个数

    岛屿的个数 给一个01矩阵,求不同的岛屿的个数. 0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右为相邻. 您在真实的面试中是否遇到过这个题? Yes 样例 在矩阵: ...

  5. 213. String Compression【LintCode java】

    Description Implement a method to perform basic string compression using the counts of repeated char ...

  6. 安卓客户端浏览器ajax注意

    这两天被一个bug搞疯了,就是公司安卓app上我负责的网页死活不进ajax,一开始我用的是post方式提交的,但是参数那一栏没写,直接把参数写在url上了,后来老大跟我说post不写参数会出问题,后来 ...

  7. logisitic回归

    线性回归目的是找到一条直线(或者超平面)尽可能地接近所有的训练数据点,而对数几率回归的目的是找到一条直线(或者超平面)尽可能地分开两种不同类别的数据点. 对数几率回归感觉更像是一个分类问题.https ...

  8. LeetCode 100——相同的树

    1. 题目 2. 解答 针对两棵树的根节点,有下列四种情况: p 和 q 都为空,两棵树相同: p 不为空 q 为空,两棵树不相同: p 为空 q 不为空,两棵树不相同: p 和 q 都不为空,如果两 ...

  9. springMVC对jsp页面的数据进行校验

    一. 使用注解校验 a) 引入校验依赖包 <dependency> <groupId>javax.validation</groupId> <artifact ...

  10. 【转】Expressions versus statements in JavaScript

    原文地址:http://www.2ality.com/2012/09/expressions-vs-statements.html Update 2012-09-21: New in Sect. 4: ...