油田問題--detecting underground oil deposits

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章