【代码随想录算法训练营——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的写法要记住。
代码
#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 + xnexty = j + yif nextx < 0 or nextx >= len(graph) or nexty < 0 or nexty >= len(graph[0]):continueif graph[nextx][nexty] == 1 and visited[nextx][nexty] == False:visited[nextx][nexty] = Truedfs(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 += 1visited[i][j] = Truedfs(i, j, visited, graph)print(result)
#100.最大岛屿的面积
#dfs法
point = [[1, 0], [-1, 0], [0, 1], [0, -1]]
count = 0
def dfs(i, j, visited, graph):global countfor 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]):continueif graph[nextx][nexty] == 1 and visited[nextx][nexty] == False:count += 1visited[nextx][nexty] = Truedfs(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 = 0for i in range(n):for j in range(m):if graph[i][j] == 1 and visited[i][j] == False:count = 1visited[i][j] = Truedfs(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 countqueue = 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]):continueif graph[nextx][nexty] == 1 and visited[nextx][nexty] == False:count += 1visited[nextx][nexty] = Truequeue.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 = 0for i in range(n):for j in range(m):if graph[i][j] == 1 and visited[i][j] == False:count = 1visited[i][j] = Truebfs(i, j, visited, graph)ans = max(ans, count)print(ans)
