我一直在努力解决这个问题,但我无法解决这个问题。
我需要检查矩阵中的元素是否连续。例如:
1 0 1 0 0 0
0 1 0 0 1 0
0 0 1 1 0 0
在这种情况下,1是连接的,因为它们是连续的。
检查此示例:
1 0 0 0 1
0 1 0 0 1
1 0 0 0 1
0 0 1 0 0
在这种情况下,1不连续,因为它们没有连接。 如您所见,矩阵大小各不相同。
答案 0 :(得分:1)
一些递归就可以解决问题。
以下是算法的说明:
1
0
1
的所有相邻单元格中,从第2点开始重复。1
- 如果找到则矩阵未连接澄清最后一点 - 如果矩阵中剩余1
,则表示我们的算法没有达到它。由于它只移动到相邻的单元格,因此我们得出结论,剩余的1
未与步骤1中的初始1
相关联。
以下是代码:
def find_a_1():
for row_i, row in enumerate(matrix):
if '1' in row:
return {
'row': row_i,
'col': row.index('1'),
}
def walk_the_matrix(point):
""" Clear current point and move to adjacent cells that are "1s" """
# check if this is a valid cell to work on:
try:
if point['row'] < 0 or point['col'] < 0:
raise IndexError # prevent negative indexes
if matrix[point['row']][point['col']] == '0':
return # nothing to do here, terminate this recursion branch
except IndexError:
return # we're outside of the matrix, terminate this recursion branch
# clear this cell:
matrix[point['row']][point['col']] = '0'
# recurse to all 8 directions:
for i in (-1, 0, 1):
for j in (-1, 0, 1):
if (i, j) == (0, 0):
continue
walk_the_matrix({
'row': point['row'] + i,
'col': point['col'] + j,
});
示例:
matrix = [
list('001001'),
list('010000'),
list('001110'),
list('110000'),
]
starting_point = find_a_1()
walk_the_matrix(starting_point)
if find_1() is None:
print("The matrix is connected")
else:
print("The matrix is not connected")
请注意,这会改变matrix
列表。
答案 1 :(得分:1)
编辑,因为我误读了原始问题
问题似乎归结为“有没有1完全被0包围?”。
假设my_array
由0和1组成,我可以使用2D卷积计算每个单元周围> 1的单元格数量的简洁方法。
import numpy as np
import scipy.signal as ss
kernel = np.ones((3,3))
count = ss.convolve2d(my_array, kernel, mode='same') # Count number of 1s around each cell
contig = my_array * count # Remove counts where the 'centre cell' is zero
要检查my_array
是否有任何孤立的1,只需检查contig
中的任何1:
test_contig = sum(contig[contig==1]) > 0