day51 第十一章:图论part02

发布于:2025-02-15 ⋅ 阅读:(91) ⋅ 点赞:(0)

99. 岛屿数量 深搜

每一块的上下左右都遍历过了之后,这块陆地就遍历完了。是深搜,不是广搜

深搜:递归

def dfs():

        if .....:

                终止条件

        dfs(子节点)

directions = [[0,1],[1,0],[0,-1],[-1,0]]

def dfs(grid, visited, x, y):
    if grid[x][y] == 0 or visited[x][y]:
        return
    visited[x][y] = True
    for i in range(4):
        next_x = x + directions[i][0]
        next_y = y + directions[i][1]
        if next_x < 0 or next_x >=n or next_y < 0 or next_y >= m:
            continue
        dfs(grid, visited, next_x, next_y)
    
    
if __name__ == '__main__':
    n, m = map(int, input().split())
    
    grid = []
    for _ in range(n):
        grid.append(list(map(int, input().split())))
        
    visited = [[False]*m for _ in range(n)]
    res = 0
    
    for i in range(n):
        for j in range(m):
            if grid[i][j] == 1 and not visited[i][j]:
                res += 1 
                dfs(grid, visited, i, j)
    
    print(res)
    

99. 岛屿数量 广搜

广搜用队列(deque),

先加进去第一个节点

while que:

        cur = que.popleft()

        for cur_child in cur_children:

                que.append(cur_child)

        

from collections import deque
directions = [[0,1],[1,0],[0,-1],[-1,0]]

def bfs(grid, visited, x, y):
    que = deque([])
    que.append([x,y])
    visited[x][y] = True
    while que:
        cur_x, cur_y = que.popleft()
        for i in range(4):
            next_x = cur_x + directions[i][0]
            next_y = cur_y + directions[i][1]
            if next_x < 0 or next_x >=n or next_y < 0 or next_y >= m:
                continue
            elif grid[next_x][next_y] == 1 and not visited[next_x][next_y]:
                que.append([next_x, next_y])
                visited[next_x][next_y] = True
            
    
if __name__ == '__main__':
    n, m = map(int, input().split())
    
    grid = []
    for _ in range(n):
        grid.append(list(map(int, input().split())))
        
    visited = [[False]*m for _ in range(n)]
    res = 0
    
    for i in range(n):
        for j in range(m):
            if grid[i][j] == 1 and not visited[i][j]:
                res += 1 
                bfs(grid, visited, i, j)
    
    print(res)
    

100. 岛屿的最大面积

dfs

# dfs,bfs都行
# dfs
directions = [[0,1],[1,0],[0,-1],[-1,0]]
max_area = 0
area = 0


def dfs(grid, visited, x, y):
    global area
    global max_area

    if grid[x][y] == 0 or visited[x][y] == True:
        return
    visited[x][y] = True
    area += 1
    max_area = max(max_area, area)
    # print("area=", area)
    # print("max_area=", max_area)
    for i in range(4):
        next_x = x + directions[i][0]
        next_y = y + directions[i][1]
        if next_x < 0 or next_x >= n or next_y < 0 or next_y >= m:
            continue
        dfs(grid, visited, next_x, next_y)
        
if __name__ == "__main__":
    n,m = map(int, input().split())

    grid = []
    for _ in range(n):
        grid.append(list(map(int, input().split())))

    # n,m = 4, 5
    # grid = [[1,1,0,0,0],[1,1,0,0,0],[0,1,1,0,0],[0,0,0,1,1]]

    visited = [[False]*m for _ in range(n)]

    for i in range(n):
        for j in range(m):
            if grid[i][j] == 1 and not visited[i][j]:
                area = 0
                dfs(grid, visited, i, j)
    
    print(max_area)
    

bfs

# dfs,bfs都行
# bfs
from collections import deque
directions = [[0,1],[1,0],[0,-1],[-1,0]]

def bfs(grid, visited, x, y):
    area = 0
    que = deque()
    que.append([x,y])
    while que:
        cur_x, cur_y = que.popleft()
        if grid[cur_x][cur_y] == 1 and not visited[cur_x][cur_y]:
            area += 1
            visited[cur_x][cur_y] = True
            for i in range(4):
                next_x = cur_x + directions[i][0]
                next_y = cur_y + directions[i][1]
                if next_x < 0 or next_x >= n or next_y < 0 or next_y >=m:
                    continue
                # if grid[next_x][next_y] == 1 and not visited[next_x][next_y]:
                que.append([next_x, next_y])
            
    return area


       
if __name__ == "__main__":
    n,m = map(int, input().split())

    grid = []
    for _ in range(n):
        grid.append(list(map(int, input().split())))

    visited = [[False]*m for _ in range(n)]
    max_area = 0

    for i in range(n):
        for j in range(m):
            if grid[i][j] == 1 and not visited[i][j]:
                # area = 0
                # global max_area
                max_area = max(max_area, bfs(grid, visited, i, j))
    
    print(max_area)
    


网站公告

今日签到

点亮在社区的每一天
去签到