代码随想录算法训练营第五十一天|99.岛屿数量 深搜 99.岛屿数量 广搜 100.岛屿的最大面积

99.岛屿数量 深搜

99. 计数孤岛

代码随想录

思路:这道题也可以算是深搜的模板题了,不过已经很久没做深搜了,还是讲讲退出dfs的两种处理方法。一种是没有明显的return,另一种是有。有的情况就是先判断节点是否合法,一定要是合法的节点才会进行后续的运算。没有return其实也没啥区别,只是不会有一个明显的退出环节

python 复制代码
direction=[[0,1],[0,-1],[1,0],[-1,0]]

def main():
    n,m=map(int,input().split())
    graph=[]
    for i in range(n):
        graph.append(list(map(int,input().split())))
    visit=[[False]*m for _ in range(n)]
    result=0
    for i in range(n):
        for j in range(m):
            if graph[i][j]==1 and not visit[i][j]:
                result+=1
                visit[i][j]=True
                dfs(graph,visit,i,j)
    print(result)

def dfs(graph,visit,x,y):
    for i,j in direction:
        next_x=x+i
        next_y=y+j

        if next_x<0 or next_x>=len(graph):
            continue
        if next_y<0 or next_y>=len(graph[0]):
            continue
        if not visit[next_x][next_y] and graph[next_x][next_y]==1:
            visit[next_x][next_y]=True
            dfs(graph,visit,next_x,next_y)

if __name__=="__main__":
    main()
python 复制代码
direction=[[0,1],[0,-1],[1,0],[-1,0]]

def main():
    n,m=map(int,input().split())
    graph=[]
    for i in range(n):
        graph.append(list(map(int,input().split())))
    visit=[[False]*m for _ in range(n)]
    result=0
    for i in range(n):
        for j in range(m):
            if graph[i][j]==1 and not visit[i][j]:
                result+=1
                dfs(graph,visit,i,j)
    print(result)

def dfs(graph,visit,x,y):
    if visit[x][y] or graph[x][y]==0:
        return
    visit[x][y]=True
    for i,j in direction:
        next_x=x+i
        next_y=y+j

        if next_x<0 or next_x>=len(graph):
            continue
        if next_y<0 or next_y>=len(graph[0]):
            continue
        if not visit[next_x][next_y] and graph[next_x][next_y]==1:
            dfs(graph,visit,next_x,next_y)

if __name__=="__main__":
    main()

99.岛屿数量 广搜

99. 计数孤岛

代码随想录

思路:同样的,这道题是广搜的模板题,不过其实我对广搜不熟悉,所以写起来挺费劲的。广搜和之前二叉树的层序遍历一样,都要使用队列。main函数的部分,其实和dfs相同,在进入了bfs之后,首先给自己的位置visit数组变成True,然后将这个位置加入队列,接下来遍历队列,将每个方向的合法新位置加入队列,直到队列为空。

python 复制代码
from collections import deque
directions=[[0,1],[0,-1],[1,0],[-1,0]]

def main():
    n,m=map(int,input().split())
    graph=[]
    for i in range(n):
        graph.append(list(map(int,input().split())))
    visit=[[False]*m for _ in range(n)]
    result=0
    for i in range(n):
        for j in range(m):
            if not visit[i][j] and graph[i][j]==1:
                result+=1
                bfs(graph,visit,i,j)
    print(result)

def bfs(graph,visit,x,y):
    que=deque([])
    que.append([x,y])
    visit[x][y]=True
    while que:
        cur_x,cur_y=que.popleft()
        for i,j in directions:
            next_x=cur_x+i
            next_y=cur_y+j
            if next_x<0 or next_x>=len(graph) or next_y<0 or next_y>=len(graph[0]):
                continue
            if not visit[next_x][next_y] and graph[next_x][next_y]==1:
                que.append([next_x,next_y])
                visit[next_x][next_y]=True


if __name__=="__main__":
    main()

100.岛屿的最大面积

100. 最大岛屿的面积

代码随想录

思路:这道题基本上就是模板题上加一个统计,不过需要注意的有两个点。一个是cnt+1只会在判断合法后使用,第二个就是cnt如果要全局定义有两种方法,一是将cnt定义为一个数组,所有变化都发生在cnt0上,二是在dfs中定义nonlocal cnt

python 复制代码
cnt=[0]
directions=[[1,0],[-1,0],[0,1],[0,-1]]

def main():
    n,m=map(int,input().split())
    graph=[]
    for i in range(n):
        graph.append(list(map(int,input().split())))
    visit=[[False]*m for _ in range(n)]
    result=0
    for i in range(n):
        for j in range(m):
            if not visit[i][j] and graph[i][j]==1:
                visit[i][j]=True
                cnt[0]=1
                dfs(graph,visit,i,j)
                result=max(result,cnt[0])
    print(result)

def dfs(graph,visit,x,y):
    for i,j in directions:
        next_x=x+i
        next_y=y+j
        if next_x<0 or next_x>=len(graph):
            continue
        if next_y<0 or next_y>=len(graph[0]):
            continue
        if not visit[next_x][next_y] and graph[next_x][next_y]:
            visit[next_x][next_y]=True
            cnt[0]+=1
            dfs(graph,visit,next_x,next_y)

if __name__=="__main__":
    main()

        
python 复制代码
directions=[[1,0],[-1,0],[0,1],[0,-1]]

def main():
    n,m=map(int,input().split())
    graph=[]
    for i in range(n):
        graph.append(list(map(int,input().split())))
    visit=[[False]*m for _ in range(n)]
    result=0
    def dfs(graph,visit,x,y):
        nonlocal cnt
        for i,j in directions:
            next_x=x+i
            next_y=y+j
            if next_x<0 or next_x>=len(graph):
                continue
            if next_y<0 or next_y>=len(graph[0]):
                continue
            if not visit[next_x][next_y] and graph[next_x][next_y]:
                visit[next_x][next_y]=True
                cnt+=1
                dfs(graph,visit,next_x,next_y)
    for i in range(n):
        for j in range(m):
            if not visit[i][j] and graph[i][j]==1:
                visit[i][j]=True
                cnt=1
                dfs(graph,visit,i,j)
                result=max(result,cnt)
    print(result)



if __name__=="__main__":
    main()

        
相关推荐
geats人山人海1 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz2 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni2 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu2 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_7983 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭3 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶3 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶3 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展
图灵机z3 小时前
【算法提高课】AcWing 1027. 方格取数 长期攻克提高课-day3(3/219)
算法
hans汉斯3 小时前
计算机科学与应用|改进MeanShift算法在智能监控视频中的应用研究
图像处理·人工智能·功能测试·深度学习·算法·音视频