Description
GeoSurvComp地質調查公司負責探測地下石油儲藏。 GeoSurvComp現在在一塊矩形區域探測石油,並把這個大區域分成了很多小塊。他們通過專業設備,來分析每個小塊中是否蘊藏石油。如果這些蘊藏石油 的小方格相鄰,那麼他們被認爲是同一油藏的一部分。在這塊矩形區域,可能有很多油藏。你的任務是確定有多少不同的油藏。
Input
輸入可能有多個矩形區域(即可能有多組測試)。每個矩形區域的起始行包含m和n,表示行和列的數量,1<=n,m<=100,如果m =0表示輸入的結束,接下來是n行,每行m個字符。每個字符對應一個小方格,並且要麼是'*',代表沒有油,要麼是'@',表示有油。
Output
對於每一個矩形區域,輸出油藏的數量。兩個小方格是相鄰的,當且僅當他們水平或者垂直或者對角線相鄰(即8個方向)。
Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
Sample Output
0
1
2
2
1.思路 深度優先搜索,從頭檢查每一個點的連通塊,檢查過了就做好標記(替換),以免重複讀塊計數。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[105][105];
int n,m,cnt[105],k;
int dx[]={-1,-1,-1,0,0,1,1,1},
dy[]={-1,0,1,-1,1,-1,0,1};
int dfs(int x,int y)
{
if(a[x][y] == '@' && x < m && x >= 0 && y >= 0 && y < n)//檢查該點是否爲油田且在範圍內
{
a[x][y] = '1'; //替換掉爲了避免重複
for(int i = 0; i < 8 ; i++)//遍歷當前該點的周圍八點
{
int xx = x + dx[i];
int yy = y + dy[i];
dfs(xx,yy);
}
return 1;
}
return 0;
}
int main()
{
int i,j;
k = 0;
while(scanf("%d %d",&m,&n) == 2) //按題意輸入格式
{
if( m == 0 && n == 0) //退出條件
break;
memset(a,0,sizeof(a));//該方法是將數組初始化爲0
for(i = 0; i < m; i++)
scanf("%s",a[i]);
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
if(dfs(i,j))
cnt[k]++;
}
}
k++;
}
for(i = 0; i < k ; i++) //按題意輸出格式,所以採用一個數組來存,一起輸出
printf("%d\n",cnt[i]);
return 0;
}