tasks for today:
1. 99.岛屿数量(DFS)
2. 99.岛屿数量(BFS)
3. 100.岛屿最大面积
--------------------------------------------------------------------
1. 99.岛屿数量(DFS)
direction = [[0, 1], [0, -1], [1, 0], [-1, 0]]
def dfs(graph, visited, x, y):
for dirx, diry in direction:
searchx = x + dirx
searchy = y + diry
if searchx < 0 or searchx >= len(graph) or searchy < 0 or searchy >= len(graph[0]):
continue
if graph[searchx][searchy] == 1 and not visited[searchx][searchy]:
visited[searchx][searchy] = True
dfs(graph, visited, searchx, searchy)
def main():
n, m = map(int, input().split())
graph = []
for i in range(n):
graph.append(list(map(int, input().split())))
visited = [[False] * m for _ in range(n)]
result = 0
for i in range(n):
for j in range(m):
if graph[i][j] == 1 and not visited[i][j]:
result += 1
visited[i][j] = True
dfs(graph, visited, i, j)
print(result)
if __name__ == "__main__":
main()
2. 99.岛屿数量(BFS)
pay attention: as long as the point is added into the queue, that means the point has been visited, do not wait until the point is poped out.
from collections import deque
direction = [[0, 1], [0, -1], [1, 0], [-1, 0]]
def bfs(graph, visited, x, y):
bfsQueue = deque()
bfsQueue.append([x,y])
visited[x][y] = True
while bfsQueue:
curNode = bfsQueue.popleft()
for dirx, diry in direction:
searchx = curNode[0] + dirx
searchy = curNode[1] + diry
if searchx < 0 or searchx >= len(graph) or searchy < 0 or searchy >= len(graph[0]):
continue
if graph[searchx][searchy] == 1 and not visited[searchx][searchy]:
bfsQueue.append([searchx, searchy])
visited[searchx][searchy] = True
def main():
n, m = map(int, input().split())
graph = []
for i in range(n):
graph.append(list(map(int, input().split())))
visited = [[False] * m for _ in range(n)]
result = 0
for i in range(n):
for j in range(m):
if graph[i][j] == 1 and not visited[i][j]:
result += 1
# visited[i][j] = True
bfs(graph, visited, i, j)
print(result)
if __name__ == "__main__":
main()
3. 100.岛屿最大面积
DFS
direction = [[1,0],[-1,0],[0,1],[0,-1]]
def dfs(graph, visited, x, y, area):
for dirx, diry in direction:
searchx = x + dirx
searchy = y + diry
if searchx < 0 or searchx >= len(graph) or searchy < 0 or searchy >= len(graph[0]):
continue
if graph[searchx][searchy] == 1 and not visited[searchx][searchy]:
visited[searchx][searchy] = True
area += 1
area = dfs(graph, visited, searchx, searchy, area)
return area
def main():
n, m = map(int, input().split())
graph = []
for i in range(n):
graph.append(list(map(int, input().split())))
visited = [[False] * m for _ in range(n)]
result = 0
for i in range(n):
for j in range(m):
if graph[i][j] == 1 and not visited[i][j]:
area = 1
visited[i][j] = True
area = dfs(graph, visited, i, j, area)
result = max(area, result)
print(result)
if __name__ == "__main__":
main()
BFS
from collections import deque
direction = [[1,0],[-1,0],[0,1],[0,-1]]
def bfs(graph, visited, x, y, area):
bfsQueue = deque()
bfsQueue.append([x,y])
visited[x][y] = True
while bfsQueue:
curNode = bfsQueue.popleft()
for dirx, diry in direction:
searchx = curNode[0] + dirx
searchy = curNode[1] + diry
if searchx < 0 or searchx >= len(graph) or searchy < 0 or searchy >= len(graph[0]):
continue
if graph[searchx][searchy] == 1 and not visited[searchx][searchy]:
bfsQueue.append([searchx,searchy])
visited[searchx][searchy] = True
area += 1
return area
def main():
n, m = map(int, input().split())
graph = []
for i in range(n):
graph.append(list(map(int, input().split())))
visited = [[False] * m for _ in range(n)]
result = 0
for i in range(n):
for j in range(m):
if graph[i][j] == 1 and not visited[i][j]:
area = 1
# visited[i][j] = True
area = bfs(graph, visited, i, j, area)
result = max(area, result)
print(result)
if __name__ == "__main__":
main()