思路:
1.求孤岛面积
孤岛指的是四周都是水的岛屿。遍历边界周围的岛屿,将它们全部淹没(grid[i][j]==0),最后再次扫描网格,统计1的个数。
#求孤岛面积
# 4 5
# 1 1 1 1 0
# 1 1 0 1 0
# 1 1 0 0 0
# 0 0 0 0 0
# 输出: 0
def lonelyIslandArea(grid,m,n):
dirs=[(0,1),(0,-1),(1,0),(-1,0)] #四个方向
#递归逻辑
def dfs(x,y):
if x<0 or x>=m or y<0 or y>=n: #判断是否越界
return
if grid[x][y]==0: #判断是否为陆地
return
grid[x][y]=0 #将该陆地沉没
for dx,dy in dirs:
dfs(x+dx,y+dy)
#遍历网格
for i in range(m):
for j in range(n):
if grid[i][j]==1 and (i==0 or i==m-1 or j==0 or j==n-1):
dfs(i,j) #对于边缘上的陆地,调用dfs置为0
#再次遍历岛屿,统计孤岛面积
res=0
for i in range(m):
for j in range(n):
if grid[i][j]==1:
res+=1
print(res)
return res
def main():
m,n=map(int,input().split())
grid=[]
for i in range(m):
line=list(map(int,input().split()))
grid.append(line)
lonelyIslandArea(grid,m,n)
if __name__=="__main__":
main()
2.淹没孤岛
遍历边界上的所有岛,递归搜索相连的岛屿,全部修改标记为2。最后遍历一遍图,将所有2修改为1,将所有1修改为0,返回网格图,完成淹没孤岛。
#淹没孤岛
# 4 5
# 1 1 0 0 0
# 1 1 0 0 0
# 0 0 1 0 0
# 0 0 0 1 1
# 下面是输出
# 1 1 0 0 0
# 1 1 0 0 0
# 0 0 0 0 0
# 0 0 0 1 1
# import sys
# sys.setrecursionlimit(1000000)
def yanmoIsland(grid,m,n):
dirs=[(0,1),(0,-1),(1,0),(-1,0)]
def dfs(x,y):
if x<0 or x>=m or y<0 or y>=n:
return
if grid[x][y]==0 or grid[x][y]==2:
return
grid[x][y]=2
for dx,dy in dirs:
dfs(x+dx,y+dy)
for i in range(m):
for j in range(n):
if (i==0 or i==m-1 or j==0 or j==n-1) and grid[i][j]==1: #是边缘陆地,才能进入dfs递归
dfs(i,j)
for i in range(m):
for j in range(n):
if grid[i][j]==2:
grid[i][j]=1
elif grid[i][j]==1:
grid[i][j]=0
for i in grid:
print(" ".join(map(str,i)))
return grid
def main():
m,n=map(int,input().split())
grid=[]
for i in range(m):
line=list(map(int,input().split()))
grid.append(line)
yanmoIsland(grid,m,n)
if __name__=="__main__":
main()