题目--oil Deposits(油田) 基础DFS(深度搜索)

上一次基本了解了下BFS,这次又找了个基本的DFS题目来试试水,DFS举个例子来说就是 一种从树的最左端开始一直搜索到最底端,然后回到原端再搜索另一个位置到最底端,也就是称为深度搜索的DFS--depth first search,话不多说,直接上题了解:

Description:
某石油勘探公司正在按计划勘探地下油田资源,工作在一片长方形的地域中。他们首先将该地域划分为许多小正方形区域,然后使用探测设备分别探测每一块小正方形区域内是否有油。若在一块小正方形区域中探测到有油,则标记为’@’,否则标记为’*’。如果两个相邻区域都为1,那么它们同属于一个石油带,一个石油带可能包含很多小正方形区域,而你的任务是要确定在一片长方形地域中有多少个石油带。 所谓相邻,是指两个小正方形区域上下、左右、左上右下或左下右上同为’@’。
Input:
输入数据将包含一些长方形地域数据,每个地域数据的第一行有两个正整数m和n,表示该地域由m*n个小正方形所组成,如果m为0,表示所有输入到此结束;否则,后面m(1≤m≤100)行数据,每行有n(1≤n≤100)个字符,每个字符为’@’或’*’,表示有油或无油。每个长方形地域中,’@’的个数不会超过100。
Output:
每个长方形地域,输出油带的个数,每个油带值占独立的一行。油带值不会超过100。
Sample Input:
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@**@
*@**@
@@@*@
@@**@
0 0
Sample Output:
0
1
2
2

思路:

搜索到一个“@”后开始搜索其周围的“@”一直到无法搜索到为止,从第一个“@”开始将其本身和其他与之连接的“@”变为成“ * ”,防止重复。

实验代码:

 1 #include<bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 char maps[101][101];//定义油田
 6 int m,n,cnt=0;//cnt为“感染”次数(油田数量)
 7
 8 void dfs(int x,int y)
 9 {
10     if(maps[x][y]!=‘@‘||x<0||y<0||x>m||y>n)//判断是否越界和是否为油田
11     return;
12
13     else
14     {
15         maps[x][y]=‘*‘; //将其标记
16         for(int i=-1;i<=1;i++)
17         for(int j=-1;j<=1;j++)
18         dfs(x+i,y+j);//将其为中心的周围八格进行搜索
19      }
20
21 }
22
23 int main (int argc,const char * argv[])
24 {
25     while(scanf("%d %d",&m,&n))
26     {
27         if(m==0||n==0)return 0;
28         cnt=0;
29         for(int i=0;i<m;i++)
30         scanf("%s",maps[i]);
31
32         for(int i=0;i<m;i++)
33         for(int j=0;j<n;j++)
34         if(maps[i][j]==‘@‘)//搜索油田
35         {
36             cnt++;//每进入一次则代表一块油田
37             dfs(i,j);
38         }
39         cout<<cnt<<endl;
40     }
41     return 0;
42 }

原文地址:https://www.cnblogs.com/xiangqi/p/10485211.html

时间: 2024-10-12 07:52:10

题目--oil Deposits(油田) 基础DFS(深度搜索)的相关文章

UVA 572 Oil Deposits油田(DFS求连通块)

UVA 572     DFS(floodfill)  用DFS求连通块 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M

hdu 1241 Oil Deposits (一次dfs搞定有某有)

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 char map[105][105]; 7 8 int dir[8][2]={0, 1, 1, 0, -1, 0, 0, -1, 1, 1, 1, -1, -1, 1, -1, -1}; 9 int n, m; 10 int ans; 11 12

poj1562 Oil Deposits(深搜dfs)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1562 ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢

DFS深度搜索的一般思想

对于无向图来说DFS深度搜索 递归思想 //深度优先搜索DFS的一般实现 void DFS(MGraph G,int i)//DFS递归思想 { int j; visited[i]=TRUE;//设置Node已经被访问 printf("%c",G.vexs[i]); for(j=0;j<numVertexes;j++)//对此Node跟Node2(j)遍历 如果arc[][]==1则表明当前DFS的Node与Node2(j)连通,且满足Node2未被访问的条件下 则对Node2进

UVa 572 - Oil Deposits【图DFS】

Oil Deposits The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It

[LeetCode] Sum Root to Leaf Numbers dfs,深度搜索

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

[LeetCode] Convert Sorted List to Binary Search Tree DFS,深度搜索

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. Hide Tags Depth-first Search Linked List 这题是将链表变成二叉树,比较麻烦的遍历过程,因为链表的限制,所以深度搜索的顺序恰巧是链表的顺序,通过设置好递归函数的参数,可以在深度搜索时候便可以遍历了. TreeNode * help_f(Lis

[LeetCode] Maximum Depth of Binary Tree dfs,深度搜索

Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. Hide Tags Tree Depth-first Search 简单的深度搜索 #include <iostream> using namespace std; /** *

UVa 572 Oil Deposits(简单DFS)

题意: 给出油田的数量,八连通的“@”认为是一个油田.和POJ 2386 Lake Counting这个题几乎一样. 直接上代码: #include<iostream> using namespace std; char maze[105][105]; int n,m; void dfs(int x,int y) { maze[x][y]='*'; for(int dx=-1;dx<=1;dx++) for(int dy=-1;dy<=1;dy++) { int nx=x+dx,n