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

思路:

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()
相关推荐
Irene19912 小时前
Python 和 JavaScript 对照学习:字符串方法、运算符及其规则
python
m0_743623922 小时前
Python如何计算NumPy数组的协方差矩阵_调用cov函数进行特征分析
jvm·数据库·python
qq_380619162 小时前
Layui表格怎么隐藏指定列
jvm·数据库·python
21439652 小时前
mysql如何通过yum源快速安装_mysql官方yum安装教程
jvm·数据库·python
c***89202 小时前
python爬虫——爬取全年天气数据并做可视化分析
开发语言·爬虫·python
qq_654366982 小时前
mysql如何选择存储引擎_mysql MyISAM与InnoDB深度对比
jvm·数据库·python
21439652 小时前
MySQL升级如何回滚到旧版本_灾难恢复方案与快照备份恢复
jvm·数据库·python
AC赳赳老秦2 小时前
HR必备:OpenClaw批量筛选简历、发送面试通知,优化招聘流程
运维·人工智能·python·eclipse·github·deepseek·openclaw
qq_372154232 小时前
HTML怎么处理右键菜单_HTML contextmenu自定义(已废弃)替代方案【指南】
jvm·数据库·python