【代码随想录】刷题记录(115)-岛屿数量(广搜)
题目描述:
题目描述
给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。
输入描述
第一行包含两个整数 N, M,表示矩阵的行数和列数。
后续 N 行,每行包含 M 个数字,数字为 1 或者 0。
输出描述
输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。
输入示例
4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1
输出示例
3
提示信息
根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。
数据范围:
1 <= N, M <= 50
我的作答:
广度搜索就是一圈一圈向外直到搜索到边界;
from collections import deque
def bfs(grid, visited, cur_x, cur_y):
que = deque([]) #使用队列进行迭代
que.append([cur_x, cur_y])
direction = [[0, 1], [1, 0], [0, -1], [-1, 0]]
while que:
cur_x, cur_y = que.popleft()
for i, j in direction:
next_x = cur_x+i
next_y = cur_y+j
if next_x<0 or next_x>len(grid)-1 or next_y<0 or next_y>len(grid[0])-1:
continue
if not visited[next_x][next_y] and grid[next_x][next_y]:
visited[next_x][next_y] = True
que.append([next_x, next_y])
N, M = map(int, input().split())
grid = []
res = 0
for _ in range(N):
grid.append(list(map(int, input().split())))
visited = [[False]*M for _ in range(N)]
for i in range(N):
for j in range(M):
if not visited[i][j] and grid[i][j]:
visited[i][j] = True
res += 1
bfs(grid, visited, i, j)
print(res)
犯了个小错误,一开始传入的参数的que不是i,j,后来发现这样不行,因为没有返回que,相当于que是局部变量,导致报错,然后改这个比较麻烦,就把参数换成索引了;
参考:
无