【代码随想录算法训练营——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)
相关推荐
踩坑记录13 小时前
leetcode hot100 easy 101. 对称二叉树 递归 层序遍历 bfs
算法·leetcode·宽度优先
2501_9403152614 小时前
leetcode182动态口令(将字符的前几个元素放在字符串后面)
算法
老鼠只爱大米15 小时前
LeetCode经典算法面试题 #98:验证二叉搜索树(递归法、迭代法等五种实现方案详解)
算法·leetcode·二叉树·递归·二叉搜索树·迭代
疯狂的喵20 小时前
C++编译期多态实现
开发语言·c++·算法
scx2013100420 小时前
20260129LCA总结
算法·深度优先·图论
2301_7657031420 小时前
C++中的协程编程
开发语言·c++·算法
m0_7487080520 小时前
实时数据压缩库
开发语言·c++·算法
小魏每天都学习20 小时前
【算法——c/c++]
c语言·c++·算法
智码未来学堂21 小时前
探秘 C 语言算法之枚举:解锁解题新思路
c语言·数据结构·算法
Halo_tjn21 小时前
基于封装的专项 知识点
java·前端·python·算法