POJ2386 Lake Counting

題目鏈接

http://poj.org/problem?id=2386

大致題意

有一個大小爲N×M的園子,雨後積起了水。八連通的積水被認爲是連在一起的。求園子裏一共有多少水窪?

* * *
* W *  八連通指的就是左圖中相對W的*的部分
* * *

解題思路

題目的意思是說八聯通的積水算一個積水,所以只要從任意的W開始,不停的把鄰接部分用.替代,1次DFS之後與初始的W連接的所有W都被替換成了.,因此直到圖中不再存在W爲止,總共進行的DFS的次數就是答案了。

AC代碼

#include <iostream>
using namespace std;

char field[110][110];
int N, M;

//現在位置是(x,y)
void dfs(int x, int y)
{
    //將現在所在的位置替換問'.'
    field[x][y] = '.';

    //循環遍歷移動的8個方向
    for(int dx = -1; dx <= 1; dx++) {
        for(int dy = -1; dy <= 1; dy++) {
            int nx = x + dx;
            int ny = y + dy;
            //判斷(nx,ny)是不是在園子內,以及是否有積水
            if(0 <= nx && nx <= N && 0 <= ny && ny <= M && field[nx][ny] == 'W') {
                dfs(nx, ny);
            }
        }
    }
    return ;
}

int main()
{
    int ans = 0;
    cin >> N >> M;
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            cin >> field[i][j];
        }
    }
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            if(field[i][j] == 'W') {
                //從·有W的地方開始DFS
                dfs(i, j);
                ans++;
            }
        }
    }
    cout << ans << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章