我试图计算二维二进制矩阵中的孤岛数量(一组相连的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集群。
7
5
我尝试调试任何逻辑错误的代码。但是我找不到问题所在。
除了第21行,您的算法几乎是正确的:
if r != i and c != j: cnt += count_houses(mat, visited, r, c)
相反,您要使用or您想继续计数的条件,前提是至少有一个坐标与您的中心不同。
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)