首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

NYUOJ 27 水池數目:BFS 連通分量計數

     編輯:C++ 入門

NYUOJ 27 水池數目:BFS 連通分量計數

給定 m×n 矩陣(m,n < 100),1 代表水,0 代表陸地。上下左右相鄰的水視為同一水池。求水池個數。多組測試數據。

標準 BFS/DFS 連通分量模板

#include <stdio.h>
#include <string.h>

int s[105][105];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};

void dfs(int x, int y) {
    s[x][y] = 0;  // 標記已訪問
    for (int k = 0; k < 4; k++) {
        int nx = x + dx[k], ny = y + dy[k];
        if (s[nx][ny]) dfs(nx, ny);
    }
}

int main() {
    int test, m, n, i, j, ans;
    scanf("%d", &test);
    while (test--) {
        scanf("%d%d", &m, &n);
        memset(s, 0, sizeof(s));
        for (i = 1; i <= m; i++)
            for (j = 1; j <= n; j++)
                scanf("%d", &s[i][j]);
        ans = 0;
        for (i = 1; i <= m; i++)
            for (j = 1; j <= n; j++)
                if (s[i][j]) {
                    dfs(i, j);
                    ans++;
                }
        printf("%d\n", ans);
    }
    return 0;
}

關鍵細節

  • 數組下標從 1 開始,方便邊界檢查(周圍隱含 0 墊層)。
  • 遞歸 DFS 修改原數組標記,無需額外 vis 陣列。
  • 遞歸深度 ≤ 10000,棧安全(C/C++ 默認棧通常足夠)。
  • 輸入格式:數字間有空格,scanf("%d") 自動跳過空白。

BFS 迭代版

void bfs(int sx, int sy) {
    queue<pair<int,int>> q;
    q.push({sx, sy});
    s[sx][sy] = 0;
    while (!q.empty()) {
        auto [x, y] = q.front(); q.pop();
        for (int k = 0; k < 4; k++) {
            int nx = x + dx[k], ny = y + dy[k];
            if (s[nx][ny]) {
                s[nx][ny] = 0;
                q.push({nx, ny});
            }
        }
    }
}

複雜度

  • 時間:O(m*n),每個格子進隊/遞歸一次。
  • 空間:O(m*n),隊列或遞歸棧。

樣例驗證

輸入:

2
3 4
1 0 0 0
0 0 1 1
1 1 1 0
5 5
1 1 1 1 0
0 0 1 0 1
0 0 0 0 0
1 1 1 0 0
0 0 1 1 1

輸出:2 和 3。

此題是連通分量計數的標準練習,掌握 DFS/BFS 模板、數組邊界處理、多測試用例循環,是圖論算法入門必經之路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved