- //#include <iostream>
- //#include <vector>
- #include <bits/stdc++.h>
- using namespace std;
- int M, N;
- vector<vector<int>> grid;
- vector<vector<bool>> visited;
- int directions[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 上、下、左、右
- // 深度優先搜尋(DFS)來計算連通區域面積
- int dfs(int x, int y) {
- if (x < 0 || x >= M || y < 0 || y >= N || grid[x][y] != 0 || visited[x][y]) {
- return 0;
- }
-
- visited[x][y] = true; // 標記已訪問
- int area = 1; // 計算當前區域的大小
-
- // 搜尋四個方向
- for (int i = 0; i < 4; i++) {
- int newX = x + directions[i][0];
- int newY = y + directions[i][1];
- area += dfs(newX, newY);
- }
-
- return area;
- }
- int main() {
- // 讀取 M 和 N
- cin >> M >> N;
-
- grid.assign(M, vector<int>(N));
- visited.assign(M, vector<bool>(N, false));
-
- // 讀取 M × N 的地形資料
- for (int i = 0; i < M; i++) {
- for (int j = 0; j < N; j++) {
- cin >> grid[i][j];
- }
- }
-
- int maxArea = 0;
- // 遍歷所有的點
- for (int i = 0; i < M; i++) {
- for (int j = 0; j < N; j++) {
- if (grid[i][j] == 0 && !visited[i][j]) {
- // 找到新的低窪區域,使用 DFS 搜索
- maxArea = max(maxArea, dfs(i, j));
- }
- }
- }
- // 輸出最大的低窪區域面積
- cout << maxArea << endl;
- return 0;
- }
複製代碼 回復 1# may
-------------------------------------------------------
解題思路
輸入資料:
讀取 M(縱向大小)和 N(橫向大小)。
讀取 M × N 的二維陣列,代表地勢高度。
遍歷陣列,尋找低窪區域 (0):
若該格為 0,則用 DFS 或 BFS 搜尋其相連的 0,並統計區域大小。
搜尋相連區域:
透過 DFS 或 BFS 往 上、下、左、右 方向擴展。
標記已訪問的位置,以避免重複計算。
更新最大低窪區域面積:
每次找到一塊低窪區域,與當前最大值比較並更新。
-------------------------------------------------
測資:
測資00(基本測試)
輸入
5 5
1 1 1 1 1
1 0 0 0 1
1 0 1 0 1
1 0 0 0 1
1 1 1 1 1
輸出
6
說明
0 形成一個 6 格大小的區域,最大低窪區域面積為 6。
測資01(多個低窪區域,取最大)
輸入
1 1 1 1 1 1 1
1 0 0 1 0 0 1
1 0 1 1 1 0 1
1 0 1 0 0 0 1
1 1 1 0 1 1 1
1 1 1 1 1 1 1
輸出
5
說明
共有 3 個低窪區域:
(1,1) ~ (3,1) 共 4 格
(1,4) ~ (1,5) 共 2 格
(3,4) ~ (4,3) ~ (4,4) 共 5 格
最大的區域面積為 5。
測資 02(全為高地,沒有低窪區域)
輸入
4 4
1 2 3 4
2 3 4 5
3 4 5 4
4 5 4 3
輸出
0
說明
沒有 0,所以輸出 0。
測資03(邊界低窪區域)
輸入
7 7
0 0 1 1 1 1 1
0 1 1 1 1 1 1
1 1 1 0 0 0 1
1 1 1 0 1 0 1
1 0 0 0 1 0 1
1 0 1 1 1 1 1
1 1 1 1 1 1 1
輸出
6
說明
左上角 (0,0) ~ (1,0) 形成一個 2 格低窪區域。
中間 (2,3) ~ (4,3) ~ (4,4) ~ (3,3) 共 6 格 形成最大區域。
測資 04(大範圍低窪區域)
輸入
8 8
1 1 1 1 1 1 1 1
1 0 0 0 1 1 1 1
1 0 1 0 1 1 1 1
1 0 0 0 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
輸出
9
說明
(1,1) ~ (1,3) + (2,1) + (2,3) + (3,1) ~ (3,4) + (4,4) ~ (6,4) 共 9 格
最大的低窪區域面積為 9。
這些測資涵蓋了:
基本情況
多個低窪區域,測試最大值
無低窪區域(邊界條件)
邊界上的低窪區域
較大連通低窪區域的測試
這些測資可以幫助驗證 演算法的正確性與邊界情況,確保程式能正確計算出最大低窪區域的面積! |