【代码随想录算法训练营——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)
相关推荐
嘿黑嘿呦1 小时前
数据结构-图论-最短路径
数据结构·图论
ʚ希希ɞ ྀ1 小时前
岛屿数量 -- 图论
算法·深度优先·图论
aWty_2 小时前
实分析入门(11)--Cantor三分集
学习·数学·算法·实变函数
兰令水2 小时前
leecodecode【二叉树递归+对称】【2026.6.1打卡-java版本】
算法
地平线开发者10 小时前
profiler debug 工具用法与高一致性策略
算法·自动驾驶
编程大师哥10 小时前
匿名函数 lambda + 高阶函数
java·python·算法
我叫袁小陌11 小时前
算法解题思路指南
算法
地平线开发者11 小时前
Conv+BN+Add+ReLU 融合机制简介
算法·自动驾驶
yuanyuan2o211 小时前
模型预训练:Hugging Face Transformers 基础
算法·ai·语言模型·自然语言处理·nlp·深度优先