图论——求孤岛面积、淹没孤岛(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()
相关推荐
VIP_CQCRE5 分钟前
用 Ace Data Cloud 快速接入 AI 视频生成:HappyHorse Videos API 实战指南
人工智能·python·api·ai视频生成·acedatacloud
阿豪只会阿巴1 小时前
两小时快速入门 FastAPI--第二回
windows·python·fastapi
idingzhi1 小时前
A股量化策略日报(2026年07月12日)
python
二宝哥2 小时前
07.Python运算符详解与编码基础
python
巴啦啦小魔仙变身2 小时前
SIGINT = Signal Interrupte
linux·服务器·python
Maiko Star2 小时前
Python项目实战——网络机器人(爬虫)
爬虫·python·机器人
xlrqx2 小时前
2026年沧州家电清洗培训成本核算方法及成本控制要点
大数据·python
许彰午2 小时前
85_Python Flask开发RESTful API
python·flask·restful
梦想不只是梦与想2 小时前
OmegaConf 配置管理库的使用
python·omegaconf·结构化配置
Starmoon_dhw3 小时前
题解:P16108 「o.OI R-1」基础博弈练习题
c++·算法·图论