网格如何DFS
- 结合二叉树的DFS可以类比推出
//树dfs
void dfs(TreeNode root){
if(root!=null)
//处理当前节点
....
dfs(root.left);
dfs(root.right);
}
//网格dfs
void dfs(char[][] grid,int i,int j){
if(i<0 || i>=grid.length || j<0 || j>=grid[0].length || grid[i][j]!='1') return;
//以免重复搜索
grid[i][j]='2';
dfs(grid,i-1,j);
dfs(grid,i,j-1);
dfs(grid,i,j+1);
dfs(grid,i+1,j);
}
200. 岛屿数量
- 借助对网格的每个节点dfs即可得出岛屿的数量有多少个,因为每次深度搜索(四个方向延伸)到陆地之后置为2,即一个一个节点深度搜索可以得出所有岛屿总数,
class Solution {
public int numIslands(char[][] grid) {
int ans=0;
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]=='1') {
dfs(grid,i,j);
ans++;
}
}
}
return ans;
}
void dfs(char[][] grid,int i,int j){
if(i<0 || i>=grid.length || j<0 || j>=grid[0].length || grid[i][j]!='1') return;
grid[i][j]='2';
dfs(grid,i-1,j);
dfs(grid,i,j-1);
dfs(grid,i,j+1);
dfs(grid,i+1,j);
}
}
answer:leetcode-cn.com/problems/nu…
463. 岛屿的周长
- 此题是很好被用来分析网格DFS的
- 当搜索到边界时,岛长要+1
- 当搜索到海洋时,岛长也要+1
class Solution {
public int islandPerimeter(int[][] grid) {
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]==1) {
return dfs(grid,i,j);
}
}
}
return 0;
}
int dfs(int[][] grid,int i,int j){
//到边界了,+1
if(i<0 || i>=grid.length || j<0 || j>=grid[0].length) return 1;
//到海洋了,+1
if(grid[i][j]==0) return 1;
if(grid[i][j]!=1) return 0;
grid[i][j]=2;
return dfs(grid,i-1,j)+dfs(grid,i,j-1)+dfs(grid,i,j+1)+dfs(grid,i+1,j);
}
}