图论——求孤岛面积、淹没孤岛(python)

思路:

1.求孤岛面积

孤岛指的是四周都是水的岛屿。遍历边界周围的岛屿,将它们全部淹没(gridij==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()
相关推荐
Ticnix1 分钟前
MCP 工具拿不到 user_id?用 contextvars 做请求级用户隔离
python·agent·mcp
gb42152872 分钟前
WPS 里的 Word快速合成照片
python
databook38 分钟前
Python 常用统计图表实战指南
python·数据分析·数据可视化
wang_yb42 分钟前
Python 常用统计图表实战指南
python·数据分析·databook
魔镜er1 小时前
11-循环神经网络
人工智能·pytorch·python·深度学习·神经网络
Patrick在香港2 小时前
Python 抓香港政府公报 RSS:中英两个 feed 的 guid 零重合,lastBuildDate 停在 2016 年
python·数据处理·数据抓取·香港·rss
宁渡AI大模型2 小时前
河南宁渡科技有限公司|宁渡课堂 AI 全栈面试分享,AI 应用开发高频考点汇总
java·c++·人工智能·python·深度学习·神经网络·rag
troy1283 小时前
Python 基础语法(六):函数与模块、文件操作、异常处理
开发语言·python