【代码随想录算法训练营——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)
相关推荐
.道阻且长.3 小时前
2.LeetCode算法习题讲解--双指针--复写零
算法·leetcode·职场和发展
To_OC5 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
Forever Nore8 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
hansang_IR8 小时前
【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)
c++·算法·并查集
Tisfy10 小时前
LeetCode 3731.找出缺失的元素:哈希 / 排序
算法·leetcode·哈希算法·排序·哈希表
lucas_AI10 小时前
Q-CueGraph:你的多模态大模型会 zoom,但真的知道该看哪儿吗?
人工智能·算法
kaixin_啊啊10 小时前
test_机器学习算法学习
学习·算法·机器学习
liulilittle10 小时前
MOE路由:路由(logits: top-k/8)
c++·人工智能·算法·机器学习·llm
旖旎夜光10 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针