HDU1241 - Oil Deposits【DFS】

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

 

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