POJ 2386 Lake Counting

簡單dfs求連通塊的問題,重點在細節的處理上以及八個方向的兩種處理方式
/*
User: 476902537
Problem: 2386
Result: Accepted
Memory: 556K
Time: 47MS
Submit Time: 2014-08-12 10:13:59
*/
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <cmath>
#include <stack>
#include <queue>
#include <cstring>

using namespace std;

#define ll long long
#define llu unsigned long long
#define INF 1000000

const int maxn = 100+10;
int g[maxn][maxn];
//int vis[maxn][maxn];
int n,m;
int cnt;//記錄連通塊的數目
void dfs(int i,int j)
{
    if(i < 0 || i >= n || j < 0 || j >= m) return;//越界不訪問
    if(g[i][j] == -1) return;//已訪問過,不再訪問
    g[i][j] = -1;//標記爲-1代表已訪問過
    //當(i,j)點是水坑,也就是g[i][j] == 1時dfs
    if(g[i-1][j-1]) dfs(i-1,j-1);//左上方
    if(g[i-1][j]) dfs(i-1,j);//正上方
    if(g[i-1][j+1]) dfs(i-1,j+1);//右上方
    if(g[i][j+1]) dfs(i,j+1);//右邊
    if(g[i+1][j+1]) dfs(i+1,j+1);//右下方
    if(g[i+1][j]) dfs(i+1,j);//正下方
    if(g[i+1][j-1]) dfs(i+1,j-1);//左下方
    if(g[i][j-1]) dfs(i,j-1);//左邊
/*
另一種處理方式:
    for(int dx = -1; dx <= 1; dx++)
    {
        for(int dy = -1; dy <= 1; dy++)
        {//向x方向移動dx,向y方向移動dy,移動的結果爲(nx,ny)
            int nx = x + dx,ny = y + dy;
            if(g[nx][ny]) dfs(nx,ny);
        }
    }
*/
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
#endif // ONLINE_JUDGE
    while(cin >> n >> m)
    {
        memset(g,0,sizeof(g));
        cnt = 0;
        char ch;
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < m; ++j)
            {
                cin >> ch;
                if(ch == 'W') g[i][j] =1;//有水的地方標記爲1,無水標爲0
            }
//        for(int i = 0; i < n; ++i)
//        {
//            for(int j = 0; j < m; ++j)
//                cout << g[i][j] << " ";
//            cout << endl;
//        }
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < m; ++j)
            {
                if(g[i][j] == 1)//當g[i][j]是水坑並且沒有被訪問過的時候dfs
                {
                    cnt++;
                    dfs(i,j);
                }
            }
        cout << cnt << endl;
    }
    return 0;
}

發佈了20 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章