思路:
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()