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
思路:這是一道深搜的問題,比較簡單,就是要注意八個方向,
#include <iostream>
#include<cstdio>
using namespace std;
int m,n;
char a[101][101];
void dfs(int x,int y)
{
if(0<=x && x<m && 0<=y && y<n && a[x][y]=='@')
{ //確保不越界
a[x][y]='#'; //置0,表示已經搜索過了
dfs(x,y-1);
dfs(x,y+1);
dfs(x-1,y);
dfs(x+1,y);
dfs(x+1,y+1);
dfs(x+1,y-1);
dfs(x-1,y+1);
dfs(x-1,y-1);
}
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF && m+n)
{
int count=0;
for(int i=0;i<m;++i)
scanf("%s",&a[i]);
for(int i=0;i<m;++i)
{
for(int j=0;j<n;++j)
{
if(a[i][j]=='@')
{
dfs(i,j);
++count; //直到附近搜索完成後水池數目加一
}
}
}
printf("%d\n",count);
}
return 0;
}