我试图计算二维二进制矩阵中的孤岛数量(一组相连的1组成一个孤岛)。
例:
[
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[1, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 1]
]
在上面的矩阵中,有5个岛,分别是:
First: (0,0), (0,1), (1,1), (2,0)
Second: (1,4), (2,3), (2,4)
Third: (4,0)
Fourth: (4,2)
Fifth: (4,4)
为了计算2D矩阵中的孤岛数量,我假设矩阵为图,然后使用DFS类型的算法对孤岛进行计数。
我一直在跟踪DFS(递归函数)调用的数量,因为在Graph中有很多组件。
下面是我为此目的编写的代码:
# count the 1's in the island
def count_houses(mat, visited, i, j):
# base case
if i < 0 or i >= len(mat) or j < 0 or j >= len(mat[0]) or\
visited[i][j] is True or mat[i][j] == 0:
return 0
# marking visited at i, j
visited[i][j] = True
# cnt is initialized to 1 coz 1 is found
cnt = 1
# now go in all possible directions (i.e. form 8 branches)
# starting from the left upper corner of i,j and going down to right bottom
# corner of i,j
for r in xrange(i-1, i+2, 1):
for c in xrange(j-1, j+2, 1):
# print 'r:', r
# print 'c:', c
# don't call for i, j
if r != i and c != j:
cnt += count_houses(mat, visited, r, c)
return cnt
def island_count(mat):
houses = list()
clusters = 0
row = len(mat)
col = len(mat[0])
# initialize the visited matrix
visited = [[False for i in xrange(col)] for j in xrange(row)]
# run over matrix, search for 1 and then do dfs when found 1
for i in xrange(row):
for j in xrange(col):
# see if value at i, j is 1 in mat and val at i, j is False in
# visited
if mat[i][j] == 1 and visited[i][j] is False:
clusters += 1
h = count_houses(mat, visited, i, j)
houses.append(h)
print 'clusters:', clusters
return houses
if __name__ == '__main__':
mat = [
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[1, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 1]
]
houses = island_count(mat)
print houses
# print 'maximum houses:', max(houses)
我传入参数的矩阵输出错误。我知道了,7
但是有5
集群。
我尝试调试任何逻辑错误的代码。但是我找不到问题所在。
除了第21行,您的算法几乎是正确的:
if r != i and c != j:
cnt += count_houses(mat, visited, r, c)
相反,您要使用or
您想继续计数的条件,前提是至少有一个坐标与您的中心不同。
if r != i or c != j:
cnt += count_houses(mat, visited, r, c)
下面是另一种更直观的书写方式:
if (r, c) != (i, j):
cnt += count_houses(mat, visited, r, c)
我需要以正确的二维数组格式打印此内容。哎呀,这是错误的。需要从方法打印。我的输出似乎是一个无限循环。
问题内容: 鉴于此CSV文件: 我只是想将其加载为3行7列的矩阵/ ndarray。但是,由于某种原因,我能从numpy中脱颖而出的是一个具有3行(每行一个)且没有列的ndarray。 我可以手动迭代并将其修改为所需的形状,但这似乎很愚蠢。我只想将其加载为适当的矩阵,以便可以像在matlab中一样将其切成不同的维度并进行绘制。 问题答案: 纯麻木 请查阅loadtxt文档。 您还可以使用pytho
我知道回溯会有所帮助,但如何呢?
问题内容: 如何以矩阵框格式打印出简单的int [] [],就像我们在其中手写矩阵的格式那样。简单的循环运行显然无效。如果有帮助,我正在尝试在linux ssh终端中编译此代码。 问题答案: 产生:
问题内容: 我有一个遗留数据库,我正在尝试将其重新设计成21世纪。现有的数据结构之一涉及一个特定的类,该类包含一个二维值矩阵。如果要从数据库中对该类进行逆向工程,则最终会得到一系列属性,例如: 等等。由于这是一个6x6的矩阵,因此有很多这样的列。 我一直在寻找更好的方法,但是我不确定我在那儿。我想做的是这样的: 但这失败了: 我想不仅要尝试解决错误,还应该四处询问并尝试找到解决此映射挑战的正确 方
问题内容: 我试图创建此代码以输入m x n矩阵。我打算输入,但是代码产生了。当我输入其他m×n矩阵时,也会发生相同的情况,代码会产生行数相同的m×n矩阵。 也许您可以帮助我找到我的代码有什么问题。 问题答案: 问题出在初始化步骤上。 这段代码实际上使您的每一行都引用相同的对象。如果任何列中的任何项目发生更改-其他所有列都将发生变化: 您可以在嵌套循环中初始化矩阵,如下所示: 或者,通过使用列表理