例题一:被围绕的区域
给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
示例 1:
输入:board = [[“X”,“X”,“X”,“X”],
[“X”,“O”,“O”,“X”],
[“X”,“X”,“O”,“X”],
[“X”,“O”,“X”,“X”]]
输出:[[“X”,“X”,“X”,“X”], [“X”,“X”,“X”,“X”],
[“X”,“X”,“X”,“X”],
[“X”,“O”,“X”,“X”]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
示例 2:
输入:board = [[“X”]]
输出:[[“X”]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surrounded-regions
分析:
将被包围的o换为x;
标记没被包围的o,剩下的就是被包围的o;
没被包围的o,必有一个在边界,所以从四个边界开始做深度优先
class Solution {
public void solve(char[][] board) {
int row = board.length;
int col = board[0].length;
int[][] dir = {{-1,0},{0,1},{1,0},{0,-1}};
//左右边界
for(int i=0;i<row;i++){
if(board[i][0]=='O')
dfs(board,i,0,dir);
if(board[i][col-1]=='O')
dfs(board,i,col-1,dir);
}
//上下边界
for(int i = 1;i<col-1;i++){
if(board[0][i]=='O')
dfs(board,0,i,dir);
if(board[row-1][i]=='O')
dfs(board,row-1,i,dir);
}
/
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(board[i][j]=='Y')
board[i][j]='O';
else if(board[i][j]=='O')
board[i][j]='X';
}
}
}
private void dfs(char[][] board,int x,int y,int[][] dir){
if(x<0||x>=board.length || y<0||y>=board[0].length || board[x][y]!='O')
return ;
board[x][y] = 'Y';
for(int[] a : dir){
int newx = x+a[0];
int newy = y+a[1];
dfs(board,newx,newy,dir);
}
}
}
例题二:岛屿数量
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands例 1:
输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1
思路:dfs
class Solution {
public int numIslands(char[][] grid) {
int row = grid.length;
int col = grid[0].length;
int[][] dir = {{-1,0},{0,1},{1,0},{0,-1}};
int count = 0;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(grid[i][j]=='1'){
dfs(grid,i,j,dir);
count++;
}
}
}
return count;
}
private void dfs(char[][] grid,int x,int y,int[][] dir){
if(x<0||x>=grid.length || y<0||y>=grid[0].length || grid[x][y]!='1')
return;
grid[x][y] = '0';
for(int[] a : dir){
int newx = x+a[0];
int newy = y+a[1];
dfs(grid,newx,newy,dir);
}
}
}