题目--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 }
标签:oil,int,Deposits,DFS,地域,正方形,搜索,100 来源: https://www.cnblogs.com/xiangqi/p/10485211.html