Oil Deposits
GeoSurvComp地质调查公司负责探测地下油藏。GeoSurvComp每次只处理一个大的矩形区域,并创建一个划分的网格把土地分成许多正方形的地块。然后利用传感设备分别分析每个地块确定该地块是否含有石油。
含有石油的地块被称为油穴。如果两个口袋是相邻的,那么它们是相同的一部分石油储蓄。石油矿床可能相当大,并可能包含许多小块。你的工作是决定网格中包含多少种不同的储蓄。
Input
输入文件包含一个或多个网格。每个网格以包含m和n(数字)的一行开始
网格中的行和列,用一个空格隔开。如果m = 0,表示输入结束; 否则,1≤m≤100,1≤n≤100。后面是m行,每行n个字符(不计算行尾字符)。每个字符对应一个情节,或者是“*”,表示无油,或“@”,表示油袋。
Output
对于每个网格,输出不同的石油矿床的数量。两个不同的口袋是同一种油的一部分如果它们水平、垂直或对角线相邻,则沉积。一个石油矿床不会包含更多的石油超过100的口袋。
Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
Sample Output
0
1
2
2
#include<cstdio>
#include<cstring>
const int maxn = 100 + 5;
char pic[maxn][maxn];
int m, n, idx[maxn][maxn];
void dfs(int r, int c, int id) {
if(r < 0 || r >= m || c < 0 || c >= n) return;
if(idx[r][c] > 0 || pic[r][c] != '@') return;
idx[r][c] = id;
for(int dr = -1; dr <= 1; dr++)
for(int dc = -1; dc <= 1; dc++)
if(dr != 0 || dc != 0) dfs(r+dr, c+dc, id);
}
int main() {
while(scanf("%d%d", &m, &n) == 2 && m && n) {
for(int i = 0; i < m; i++) scanf("%s", pic[i]);
memset(idx, 0, sizeof(idx));
int cnt = 0;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(idx[i][j] == 0 && pic[i][j] == '@') dfs(i, j, ++cnt);
printf("%d\n", cnt);
}
return 0;
}