1. 程式人生 > >題目--oil Deposits(油田) 基礎DFS(深度搜索)

題目--oil Deposits(油田) 基礎DFS(深度搜索)

直接 *** std 定義 dep 所有 pos 進行 屬於

上一次基本了解了下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 Deposits(油田) 基礎DFS(深度搜索)