关于01矩阵问题
问题描述
给定形如下 的矩阵,
[
[15, 5],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 0],
]
上面矩阵的中的0代表海岸线,1代表小岛,15为下面数组的行数,5未数组的列数。求岛屿的个数及对应的面积。
注意:
假设输入无异常
样例输入 :
[5, 5],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 0],
样例输出:
岛屿个数3 面积为 8 , 1, 1
示例
class Solution:
def __init__(self, m):
self.row = m[0][0] # 行
self.column = m[0][1] # 列
m.pop(0)
self.m = m
self.areas = []
def count_islands(self):
count = 0
# 遍历二维数组,遇到为1的点,就调用感染函数
for i in range(self.row):
for j in range(self.column):
if self.m[i][j] == 1:
self.areas.append(0)
count += 1
self.infect(i, j, count + 1)
def infect(self, i, j, flag):
if i < 0 or i >= self.row or j < 0 or j >= self.column or self.m[i][j] != 1:
return
self.m[i][j] = flag # 将上下左右为1的值全部都改写为某一特定数字,属于同一个小岛的,数字相同
self.areas[-1] += 1
self.infect(i, j - 1, flag)
self.infect(i - 1, j, flag)
self.infect(i + 1, j, flag)
self.infect(i, j + 1, flag)
m1 = [
[15, 5],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 0],
]
s = Solution(m1)
s.count_islands()
areas = s.areas # 岛屿面积列表
num = len(areas) # 岛屿个数
print(areas)
参考
https://blog.csdn.net/qq_20901827/article/details/82585952