前言
深度优先与广度优先相关题解
一、被围绕的区域
给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
class Solution {
public void solve(char[][] board) {
int m = board.length;
int n = board[0].length;
int[][] book = new int[m][n];
if (board == null || board.length == 0) return;
for(int i =0;i<m;i++){
for (int j =0;j<n;j++){
book[i][j]=0;
boolean isEdge = (i==0||j==0||i==m-1||j==n-1);
if (isEdge&&board[i][j]=='O'){
dfs(i,j,board,book);
}
}
}
for(int i =0;i<m;i++){
for (int j =0;j<n;j++){
if (board[i][j]=='O'){
board[i][j]='X';
}
if(board[i][j]=='A'){
board[i][j]='O';
}
}
}
}
private void dfs(int x,int y,char[][] board,int[][] book){
int[][] next= {{0,1},{1,0},{0,-1},{-1,0}};
int m=board.length;
int n= board[0].length;
if(board[x][y]=='O'){
board[x][y]='A';
}
for(int i=0;i<=3;i++){
int tx=next[i][0]+x;
int ty=next[i][1]+y;
if(tx>m-1||ty>n-1||tx<0||ty<0){
continue;
}
if (board[tx][ty]=='O'&&book[tx][ty]==0){
book[tx][ty]=1;
dfs(tx,ty,board,book);}
}
return;
}
}
二、岛屿的数量
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
class Solution {
int num=0;
public int numIslands(char[][] grid) {
int m = grid.length;
int n =grid[0].length;
int[][] book = new int[m][n];
for(int i=0;i<m;i++){
for (int j=0;j<n;j++){
book[i][j]=0;
if (grid[i][j]=='1'){
dfs(grid,book,i,j);
num=num+1;
}
}
}
return num;
}
private void dfs(char[][] grid,int[][] book,int x,int y){
int m = grid.length;
int n =grid[0].length;
int[][] next = {{1,0},{0,1},{-1,0},{0,-1}};
grid[x][y]='a';
for (int i=0;i<=3;i++){
int tx = x + next[i][0];
int ty = y + next[i][1];
if (tx<0||ty<0||tx>m-1||ty>n-1){
continue;
}
if (book[tx][ty]==0&&grid[tx][ty]=='1'){
book[tx][ty]=1;
dfs(grid,book,tx,ty);
}
}
return;
}
}