day51 第十一章:图论part02
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)