图论——求孤岛面积、淹没孤岛(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()
相关推荐
2301_809204705 小时前
JavaScript中严格模式use-strict对引擎解析的辅助.txt
jvm·数据库·python
zjy277775 小时前
mysql如何选择合适的索引类型_mysql索引设计实战
jvm·数据库·python
Aaswk5 小时前
Java Lambda 表达式与流处理
java·开发语言·python
万邦科技Lafite5 小时前
京东item_get接口实战案例:实时商品价格监控全流程解析
java·开发语言·数据库·python·开放api·淘宝开放平台
Cyber4K6 小时前
【Python专项】进阶语法-系统资源监控与数据采集(1)
开发语言·python·php
苍煜7 小时前
Java开发IO零基础吃透:BIO、NIO、同步异步、阻塞非阻塞
java·python·nio
AllData公司负责人8 小时前
通过Postgresql同步到Doris,全视角演示AllData数据中台核心功能效果,涵盖:数据入湖仓,数据同步,数据处理,数据服务,BI可视化驾驶舱
java·大数据·数据库·数据仓库·人工智能·python·postgresql
Flittly9 小时前
【LangGraph新手村系列】(5)时间旅行:浏览历史、分叉时间线与修改过去
python·langchain
2301_7820404510 小时前
CSS Flex布局中如何实现导航栏与Logo的左右分布_利用justify-content- space-between
jvm·数据库·python
yaoxin52112310 小时前
400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件
java·开发语言·python