图论——求孤岛面积、淹没孤岛(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()
相关推荐
bigfootyazi29 分钟前
python爬虫-基本库-urllib库(常用速查)
开发语言·爬虫·python
瑶总迷弟43 分钟前
使用 mis-tei 在昇腾310P上部署 bge-m3模型
pytorch·python·华为·语言模型·自然语言处理·cnn·unix
belong_my_offer1 小时前
认识到精通函数
开发语言·python
卡次卡次12 小时前
vibecoding起步注意点:插件、Skills、MCP、Hooks
服务器·数据库·python·oracle
我的xiaodoujiao2 小时前
API 接口自动化测试详细图文教程学习系列24--如何用Pytest去设计接口测试用例并执行
python·学习·测试工具·pytest
zhangfeng11333 小时前
ai 模型加密,强化版终极防盗方案 支持烧录的显卡列表
人工智能·pytorch·python
半个落月3 小时前
深入理解 Python dict 与 set:从哈希表底层到高性能实战
python
带派擂总3 小时前
Python全栈开发 Day10_用户管理系统
python
databook3 小时前
用 SymPy 解决 Manim 曲线绘制速度不均的问题
python·数学·动效
宇宙无敌程序员菜鸟3 小时前
浅玩CRUD Agent
python