实施DFS以在矩阵中查找孤岛的问题

时间:2019-01-09 01:55:51

标签: python algorithm recursion breadth-first-search dfs

我正在尝试解决名为Number of Islands的leetcode问题

给出一个二维地图,分别是“ 1”(土地)和“ 0”(水),计算岛屿的数量。一个岛屿被水包围,是通过水平或垂直连接相邻的陆地而形成的。您可能会假设网格的所有四个边缘都被水包围了。

class Solution(object):
    def numIslands(self, grid):
        if len(grid) == 0 or len(grid[0]) == 0:
            return 0

        visited = [[False]*len(grid[0])]*len(grid)
        count = 0

        grid = [[int(k) for k in item] for item in grid]

        for i in range(0, len(grid)):
            for j in range(0, len(grid[0])):
                if visited[i][j] == False and grid[i][j] == 1:
                    print('new island---->', i, j)
                    count = count+1
                    self.dfs(grid, visited, i, j)

    def dfs(self, grid, visited, i, j):
        if i >= len(grid) or j >= len(grid[0]):
            return 
        elif grid[i][j] == 0:
            return 
        else:
            visited[i][j] = True
            self.dfs(grid, visited, i+1, j)
            self.dfs(grid, visited, i, j+1)

由于某种原因,在每次dfs调用之后,我访问过的矩阵的整个列都设置为true。我不确定为什么以及这里出了什么问题

1 个答案:

答案 0 :(得分:2)

请注意,将列表相乘会创建对相关列表的多个引用,而不是多个副本。因此[x] * 2产生[x, x]而不是[copy.copy(x), copy.copy(x)],如果x是可变的,这是一个重要的区别。因此,在初始化visited时,您将要使用列表推导而不是列表乘法:[[False for _ in range(len(grid[0]))] for _ in range(len(grid))]。这将为每个元素创建一个新列表。

由于False是不可变的,因此您可以避免对内部列表([[False] * len(grid[0]) for _ in range(len(grid))])使用乘法,但是最好养成前者的习惯。