题目
3.1568. 使陆地分离的最少天数
思路与算法
- 本周周赛第三题勉强可以看看,第四题超出我目前的水平,跳过。第三题是一个典型的dfs或者bfs的题目,连通岛屿或分割岛屿的同类型题目,注意到答案只能是0,1,2就基本结束了。注意书写。见代码
代码实现
class Solution {
int m, n;
boolean[][] used;
// 表示上下左右
private static final int[][] directions = {
{
0, 1 }, {
0, -1 }, {
-1, 0 }, {
1, 0 } };
public int minDays(int[][] grid) {
m = grid.length;
n = grid[0].length;
used = new boolean[m][n];
if (numOfLand(grid)) {
return 0;
} else {
// 枚举 去掉其中一个1看能不能满足
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) {
grid[i][j] = 0;
if (numOfLand(grid)) {
return 1;
}
grid[i][j] = 1;
}
}
}
return 2;
}
}
public boolean numOfLand(int[][] grid) {
// 计算是否有多个连通块,或者0个连通块
int count = 0;
used = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!used[i][j] && grid[i][j] == 1) {
count++;
dfs(grid, i, j);
}
}
}
return count > 1 || count == 0;
}
public void dfs(int[][] grid, int i, int j) {
used[i][j] = true;
for (int k = 0; k < 4; k++) {
int x = i + directions[k][0];
int y = j + directions[k][1];
if (inside(x, y) && !used[x][y] && grid[i][j] == 1) {
dfs(grid, x, y);
}
}
}
public boolean inside(int x, int y) {
return x >= 0 && x < m && y >= 0 && y < n;
}
}
写在最后
冲!