这张网格有几个岛
上下左右相邻算同一个岛。运行下面这段程序,看岛数 / 最大的岛多大 / 陆地总格数:
本节的网格(四行四列,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 编译。)
全部评论