【代码随想录算法训练营——Day51】图论——99.计数孤岛、100.最大岛屿的面积

卡码网题目链接

https://kamacoder.com/problempage.php?pid=1171

https://kamacoder.com/problempage.php?pid=1172

题解
99.计数孤岛

只要遇到一个1,就使用深搜或广搜,把所有相邻为1的位置都标记为已访问。深搜,怎么样把上下左右四个点都遍历递归?用一个循环来写,把递归放到循环里,遍历4次。把result的控制放在dfs外面,不放在dfs里面。我写成了在main中直接调用dfs,其实不对。

100.最大岛屿的面积

这一题还用深搜可以解决,每次到一个岛屿时递归计算遇到1时总加上面积数目,等这一轮遍历完后比较最大结果的大小。


bfs的写法要记住。

代码

python 复制代码
#99.计数孤岛
#dfs法
point = [1, 0, 0, 1, -1, 0, 0, -1]
result  = 0
def dfs(i, j, visited, graph):
    for x, y in zip(point[::2], point[1::2]):
        nextx = i + x
        nexty = j + y
        if nextx < 0 or nextx >= len(graph) or nexty < 0 or nexty >= len(graph[0]):
            continue
        if graph[nextx][nexty] == 1 and visited[nextx][nexty] == False:
            visited[nextx][nexty] = True
            dfs(nextx, nexty, visited, graph)

if __name__ == "__main__":
    n, m = map(int, input().split())
    graph = []
    for i in range(n):
        row = list(map(int, input().split()))
        graph.append(row)
    visited = [[False] * m for _ in range(n)]
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1 and visited[i][j] == False:
                result += 1
                visited[i][j] = True
                dfs(i, j, visited, graph)
    print(result)
python 复制代码
#100.最大岛屿的面积
#dfs法
point = [[1, 0], [-1, 0], [0, 1], [0, -1]]
count = 0
def dfs(i, j, visited, graph):
    global count
    for x in range(len(point)):
        nextx = i + point[x][0]
        nexty = j + point[x][1]
        if nextx < 0 or nextx >= len(graph) or nexty < 0 or nexty >= len(graph[0]):
            continue
        if graph[nextx][nexty] == 1 and visited[nextx][nexty] == False:
            count += 1
            visited[nextx][nexty] = True
            dfs(nextx, nexty, visited, graph)
if __name__ == "__main__":
    n, m = map(int, input().split())
    graph = []
    for i in range(n):
        row = list(map(int, input().split()))
        graph.append(row)
    visited = [[False] * m for _ in range(n)]
    ans = 0
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1 and visited[i][j] == False:
                count = 1
                visited[i][j] = True
                dfs(i, j, visited, graph)
                ans = max(ans, count)
    print(ans)

#bfs法
from collections import deque
point = [[1, 0], [-1, 0], [0, 1], [0, -1]]
count = 0
def bfs(i, j, visited, graph):
    global count
    queue = deque()
    queue.append(i)
    queue.append(j)

    while queue:
        x = queue.popleft()
        y = queue.popleft()
        for t in range(len(point)):
            nextx = x + point[t][0]
            nexty = y + point[t][1]
            if nextx < 0 or nextx >= len(graph) or nexty < 0 or nexty >= len(graph[0]):
                continue
            if graph[nextx][nexty] == 1 and visited[nextx][nexty] == False:
                count += 1
                visited[nextx][nexty] = True
                queue.append(nextx)
                queue.append(nexty)
            
if __name__ == "__main__":
    n, m = map(int, input().split())
    graph = []
    for i in range(n):
        row = list(map(int, input().split()))
        graph.append(row)
    visited = [[False] * m for _ in range(n)]
    ans = 0
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1 and visited[i][j] == False:
                count = 1
                visited[i][j] = True
                bfs(i, j, visited, graph)
                ans = max(ans, count)
    print(ans)
相关推荐
HelloReader1 天前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱1 天前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng8971 天前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮2 天前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员2 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish2 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱2 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者3 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮3 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者3 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶