The question can be viewed as a follow-up of the Number of Islands. For this one, we need to check the neighbors of the most out layer of the island. If one of them is boundary, it is not a closed island.
So we can do this in a BFS naturally, since BFS expands layer-by-layer gradually.
See the code below:
class Solution {
public:
int closedIsland(vector<vector<int>>& grid) {
int res = 0;
int m = grid.size(), n = grid[0].size();
vector<vector<int>> visit(m, vector<int>(n, 0));//not needed if we can modify grid' values
for(int i=0; i<m; ++i) {
for(int j=0; j<n; ++j) {
if(grid[i][j] == 0 && !visit[i][j]) {
bfs(grid, i, j, visit, res);
}
}
}
return res;
}
private:
void bfs(vector<vector<int>>& gd, int x, int y, vector<vector<int>>& visit, int &res) {
queue<pair<int, int>> q;
q.push({x, y});
visit[x][y] = 1;
vector<int> dirs = {-1, 0, 1, 0, -1};
bool ed = false;//this is the only difference
while(q.size()) {
auto t = q.front();
q.pop();
for(int i=0; i+1<dirs.size(); ++i) {
int a = t.first + dirs[i], b = t.second + dirs[i+1];
if(a<0 || a>= gd.size() || b<0 || b>=gd[0].size()) {
ed = true;//is edge
continue;
}
if(visit[a][b] || gd[a][b]) continue;
q.push({a, b});
visit[a][b] = 1;
}
}
if(!ed) ++res;
}
};
No comments:
Post a Comment