这张网格有几个岛

👁️ 1 人浏览 💬 0 人评论 ❤️ 添加收藏

上下左右相邻算同一个岛。运行下面这段程序,看岛数 / 最大的岛多大 / 陆地总格数:

本节的网格(四行四列,1 是陆地,0 是海):1100 / 1001 / 0010 / 1000。

#include <algorithm>
#include <iostream>
#include <queue>
#include <string>
#include <utility>
#include <vector>
using namespace std;

vector<vector<int>> GRID_MAP = {{1, 1, 0, 0}, {1, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 0}};
const vector<pair<int, int>> D4 = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
const vector<pair<int, int>> D8 = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};

pair<int, vector<int>> islands(const vector<vector<int>>& g, const vector<pair<int, int>>& dirs) {
    int m = g.size(), n = g[0].size();
    vector<vector<bool>> seen(m, vector<bool>(n, false));
    int cnt = 0;
    vector<int> sizes;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (g[i][j] != 1 || seen[i][j]) continue;
            cnt++;
            vector<pair<int, int>> st = {{i, j}};
            seen[i][j] = true;
            int sz = 0;
            while (!st.empty()) {
                auto [x, y] = st.back();
                st.pop_back();
                sz++;
                for (auto [dx, dy] : dirs) {
                    int a = x + dx, b = y + dy;
                    if (a >= 0 && a < m && b >= 0 && b < n && g[a][b] == 1 && !seen[a][b]) {
                        seen[a][b] = true;
                        st.push_back({a, b});
                    }
                }
            }
            sizes.push_back(sz);
        }
    }
    return {cnt, sizes};
}

int main() {
    auto [c, sz] = islands(GRID_MAP, D4);
    int mx = 0, sum = 0;
    for (int x : sz) {
        mx = max(mx, x);
        sum += x;
    }
    cout << c << "/" << mx << "/" << sum << endl;
}

(本题用 g++ -std=c++17 -O0 编译。)

提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论