【代码随想录】刷题记录(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是局部变量,导致报错,然后改这个比较麻烦,就把参数换成索引了;

 

参考:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值