Lak3 Counting(POJ No.2386)

問題描述:ios

有個大小爲N*M的園子,雨後積起了水。八連通的積水被認爲是鏈接在一塊兒的。求出園子裏總共有多少水窪。spa

N, M <= 100code

輸入例:blog

遞歸

問題分析:ci

八連通即:上、左上、左,左下,下,右下,右,右上。io

這道題能夠用深刻優先搜索(DFS)的思想。class

  1. 尋找是水窪的點。若是找到,標記此點已經記過。stream

    循環此點的八連通,若是是水,遞歸循環搜索

  2. 尋找的次數即爲水窪數。

代碼:

# include <iostream>
# include <fstream>

using namespace std;

int N, M;
char map[100][100];

void DFS_Search(int i, int j)
{
    map[i][j] = '.';
    //這樣搞定八循環的方式很是棒!!!
    for ( int dx = -1; dx <= 1; dx++)
    {
        for ( int dy = -1; dy <= 1; dy++)
        {
            int x = i + dx;
            int y = j + dy;
            if ( x >= 0 && x <= N && y >= 0 && y <= M && map[x][y] == 'W')
                DFS_Search(x, y);
        }
    }
}

int main()
{
    int count = 0;
//    ifstream cin("Lake_Counting_Data.txt");
    cin>>N>>M;
    for( int i = 0; i < N; i++)
    {
        for ( int j = 0; j < M; j++)
        {
            cin>>map[i][j];
        }
    }
    
    for( int i = 0; i < N; i++)
    {
        for ( int j = 0; j < M; j++)
        {
            if ( map[i][j] == 'W' )
            {
                count++;
                DFS_Search(i, j);
            }
        }
    }
    cout<<count<<endl;
    return 0;
}
相關文章
相關標籤/搜索