解题思路
dfs标记所有岛屿,再遍历每个0尝试链接不同编号的岛屿;
为避免和0、1混淆,编号从10开始,取大小时再减10;
代码
class Solution {
private:
vector<vector<int>> g;
vector<pair<int, int>> dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
vector<int> islands; //岛屿编号对应岛屿大小
int n, idx = 10;
public:
int dfs(int x, int y) {
g[x][y] = idx;
int cnt = 1;
for(auto [dx, dy] : dir) {
int nx = x + dx, ny = y + dy;
if(nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
if(g[nx][ny] == 1) cnt += dfs(nx, ny);
}
return cnt;
}
int trans(int x, int y) {
unordered_set<int> neibor;
int link = 1;
for(auto [dx, dy] : dir) {
int nx = x + dx, ny = y + dy;
if(nx < 0 || nx >= n || ny < 0 || ny >= n || g[nx][ny] == 0) continue;
int island_id = g[nx][ny] - 10;
if(!neibor.count(island_id)) {
link += islands[island_id];
neibor.insert(island_id);
}
}
return link;
}
int largestIsland(vector<vector<int>>& grid) {
g = grid; n = grid.size();
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(g[i][j] == 1) {
islands.push_back(dfs(i, j));
idx++;
}
}
}
if(islands.size() == 0) return 1;
int ans = *max_element(islands.begin(), islands.end());
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(g[i][j] == 0) ans = max(ans, trans(i, j));
}
}
return ans;
}
};