一、题目
二、思路
1、dfs,和求面积相似
2、遍历数组,找到值为1的就进入dfs搜索迭代
3、在dfs函数中,先判断边界,然后判断值是否为1,只要有不满足就返回
4、在dfs函数中,将值改变成2(不再变回来)
5、TempC+4,每碰到周围有一个岛屿,它的周长就减1;再进入向左、向右、向上、向下迭代
6、实时更新最大周长值
三、代码
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
if(grid.empty())
{
return 0;
}
int MaxC=0;
int TempC=0;
for(int i=0;i<grid.size();++i)
{
for(int j=0;j<grid[i].size();++j)
{
if(grid[i][j]==1)
{
dfs(grid,i,j,TempC);
//实时对比更新
MaxC=MaxC>TempC?MaxC:TempC;
TempC=0;
}
}
}
return MaxC;
}
void dfs(vector<vector<int>>& grid,int left,int right,int &TempC)
{
if(left<0|| left>=grid.size() || right<0 || right>=grid[left].size())
{
return;
}
if(grid[left][right]!=1)
{
return;
}
grid[left][right]=2;
//先假设它周围没有为1的,就加上1
TempC+=4;
//周围每有一个相邻的岛屿,周长减1
if(left+1<grid.size() && (grid[left+1][right]==1 ||grid[left+1][right]==2 ))
{
TempC--;
}
if(left-1>=0 && (grid[left-1][right]==1 ||grid[left-1][right]==2 ))
{
TempC--;
}
if(right+1<grid[left].size() && (grid[left][right+1]==1 ||grid[left][right+1]==2 ))
{
TempC--;
}
if(right-1>=0 && (grid[left][right-1]==1 || grid[left][right-1]==2 ))
{
TempC--;
}
dfs(grid,left+1,right,TempC);
dfs(grid,left-1,right,TempC);
dfs(grid,left,right+1,TempC);
dfs(grid,left,right-1,TempC);
}
};