给你一个由若干 0 和 1 组成的二维网格 grid ,其中 0 表示水,而 1 表示陆地。岛屿由水平方向或竖直方向上相邻的 1 (陆地)连接形成。
如果 恰好只有一座岛屿 ,则认为陆地是 连通的 ;否则,陆地就是 分离的 。
一天内,可以将任何单个陆地单元(1)更改为水单元(0)。
返回使陆地分离的最少天数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-number-of-days-to-disconnect-island
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
using vvi = vector<vector<int>>;
using vi = vector<int>;
int rows, cols;
int dirs[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
bool bound(int i, int j) {
if(i >= 0 && i < rows) {
if(j >= 0 && j < cols)
return 1;
}
return 0;
}
int dfs(vvi& grid, int i, int j) {
if(grid[i][j] == 0)
return 0;
grid[i][j] = 0;
for(auto& dir: dirs) {
int I = i + dir[0];
int J = j + dir[1];
if(bound(I, J)) {
dfs(grid, I, J);
}
}
return 1;
}
int getIslandNum(vvi grid) {
int res = 0;
for(int i = 0; i < rows; ++i) {
for(int j = 0; j < cols; ++j) {
res += dfs(grid, i, j);
}
}
return res;
}
int minDays(vector<vector<int>>& grid) {
rows = grid.size();
if(rows == 0 || grid[0].size() == 0)
return 0;
cols = grid[0].size();
int islandNum = getIslandNum(grid);
if(islandNum != 1)
return 0;
for(int i = 0; i < rows; ++i) {
for(int j = 0; j < cols; ++j) {
if(grid[i][j] == 0)
continue;
grid[i][j] = 0;
islandNum = getIslandNum(grid);
if(islandNum != 1) {
return 1;
}
grid[i][j] = 1;
}
}
return 2; // 一定能用2次变为分割
}
};
能写出这个题还是很开心的,实际上只是自己写出了怎么计算岛屿数量
最多能用2次分割这个真没看出来。