题目--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 }

 

上一篇:HDU1241 Oil Deposits


下一篇:UVA - 572_Oil Deposits(FloodFill)