之前在《啊哈!算法》中看到过这类题。不过这道题的飞地是不能在边界的,既然知道了不能在边界,那我们不就可以先有个思路,先处理边界,在遍历边界内飞地的数量了嘛。我参考了题解还是想了很久,就看着题解发呆,然后又看了题目要求的那两幅图才发现,我是真的菜鸡,太缺乏思考了,没有题解我都不知道能不能写出来,害!
void dfs(int**grid,int row,int col,int x,int y)
{ //判断是否越界或访问过
if(x<0||x>=row||y<0||y>=col||grid[x][y]==0)
{
return;
}
grid[x][y]=0;//把相连的1变成0
dfs(grid,row,col,x+1,y);
dfs(grid,row,col,x-1,y);
dfs(grid,row,col,x,y+1);
dfs(grid,row,col,x,y-1);
}
int numEnclaves(int** grid, int gridSize, int* gridColSize){
int row=gridSize,col=*gridColSize;
int ret=0;
//处理边界上的1
//处理第一行和最后一行
for(int i=0;i<row;i++)
{
if(grid[i][0]==1)
{
dfs(grid,row,col,i,0);
}
if(grid[i][col-1]==1)
{
dfs(grid,row,col,i,col-1);
}
}
//处理第一列和最后一列
for(int i=0;i<col;i++)
{
if(grid[0][i]==1)
{
dfs(grid,row,col,0,i);
}
if(grid[row-1][i]==1)
{
dfs(grid,row,col,row-1,i);
}
}
//边界内遍历
for(int i=1;i<row-1;i++)
{
for(int j=1;j<col-1;j++)
{
if(grid[i][j]==1)
{
ret++;
}
}
}
return ret;
}