image.png
为什么要对小岛进行沉没呢?
如下图,一旦小岛形成一个循环,不沉没的话,会进入一个循环,count会不停的++
image.png
在本题中,如下图,小岛的点会向东南西北四个方向扩散,如果扩散到边界,那递归会结束,并返回一个1,即代表周长+1。如果小岛点扩散到水域点,递归也会结束,会返回一个1,周长也加1,会默认的将已经遍历的小岛点置为2,如果小岛点变为2,代表该点已经走过,会结束递归,并返回0
然后将东南西北四个方向的值都加起来,就是周长
image.png
class Solution {
public int islandPerimeter(int[][] grid) {
int length=0;
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]==1){
length=dfs(i,j,grid);
}
}
}
return length;
}
int dfs(int i,int j,int[][] grid){
if(i<0||i>grid.length-1||j<0||j>grid[0].length-1){//小岛向边界移动,周长会+1
return 1;
}
if(grid[i][j]==0){//小岛向水域移动,周长也会+1
return 1;
}
if(grid[i][j]==2){//状态变为2,代表刚刚被遍历完,不能再加1了
return 0;
}
grid[i][j]=2;
int length=dfs(i-1,j,grid)+dfs(i+1,j,grid)+dfs(i,j-1,grid)+dfs(i,j+1,grid);
return length;
}
}
网友评论