Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于查找孤岛Python的DFS_Python_Depth First Search - Fatal编程技术网

用于查找孤岛Python的DFS

用于查找孤岛Python的DFS,python,depth-first-search,Python,Depth First Search,我尝试这种方法已经有一段时间了,但岛屿数一直是0。我不太清楚我在这里做错了什么。随着我开始越来越多地学习python,我可能会错过一些容易发现的东西 所以我想找到所有岛,其中有一个1,如果它们是连接的(相邻单元)。所以我想返回发现的岛屿数量的计数 这是我到目前为止所拥有的 def valid_direction(A, r, c): row = len(A) col = len(A[0]) if r < 0 or c < 0 or r >= row or

我尝试这种方法已经有一段时间了,但岛屿数一直是0。我不太清楚我在这里做错了什么。随着我开始越来越多地学习python,我可能会错过一些容易发现的东西

所以我想找到所有岛,其中有一个1,如果它们是连接的(相邻单元)。所以我想返回发现的岛屿数量的计数

这是我到目前为止所拥有的

def valid_direction(A, r, c):
    row = len(A)
    col = len(A[0])
    if r < 0 or c < 0 or r >= row or c >= col:
        return False
    else:
        return True

def dfs(A, r, c):
    A[r][c] = '1'
    # Up down left and right
    directions = [(0,1), 
                  (0,-1), 
                  (-1,0),
                  (1,0)] 
    for d in directions:
        nr = r +d[0]
        nc = c + d[1]
        if valid_direction(A, nr, nc) and A[nr][nc] == '1':
            dfs(A, nr, nc)


def solution(A):
    if not A:
        return -1

    row = len(A)
    col = len(A[0])
    results = 0
    for i in range(row):
        for j in range(col):
            if A[i][j] == '1':
                dfs(A, i, j)
                results +=1
    return results

你犯了一个简单的错误。您的数组是整数数组,而不是字符数组。
A[r][c]='1'
A[nr][nc]='1'
如果A[i][j]='1'

应该是
A[r][c]=1
A[nr][nc]==1
如果A[i][j]==1

我不确定这之后它是否能正确解决问题,但这是当前的错误


您当前的代码只计算1的数量。
您应该通过将1更改为2来检查1是否被访问。
此外,您不必在每次调用dfs时都启动方向,您只需将其置于函数之外即可

directions = [(0,1), 
              (0,-1), 
              (-1,0),
              (1,0)]

def valid_direction(A, r, c):
    row = len(A)
    col = len(A[0])
    if r < 0 or c < 0 or r >= row or c >= col:
        return False
    else:
        return True

def dfs(A, r, c):
    A[r][c] = 2
    # Up down left and right 
    for d in directions:
        nr = r +d[0]
        nc = c + d[1]
        if valid_direction(A, nr, nc) and A[nr][nc] == 1:
            dfs(A, nr, nc)


def solution(A):
    if not A:
        return -1

    row = len(A)
    col = len(A[0])
    results = 0
    for i in range(row):
        for j in range(col):
            if A[i][j] == 1:
                dfs(A, i, j)
                results +=1
    return results
directions=[(0,1),
(0,-1), 
(-1,0),
(1,0)]
def有效_方向(A、r、c):
行=列(A)
col=len(A[0])
如果r<0或c<0或r>=行或c>=列:
返回错误
其他:
返回真值
def dfs(A、r、c):
A[r][c]=2
#上下左右
对于d方向:
nr=r+d[0]
nc=c+d[1]
如果有效_方向(A,nr,nc)和A[nr][nc]==1:
dfs(美国、北卡罗来纳州、北卡罗来纳州)
def溶液(A):
如果不是:
返回-1
行=列(A)
col=len(A[0])
结果=0
对于范围内的i(行):
对于范围内的j(列):
如果A[i][j]==1:
dfs(A、i、j)
结果+=1
返回结果

我不完全确定你想解决什么问题,但我认为正确的代码是这样的。

你犯了一个简单的错误。您的数组是整数数组,而不是字符数组。
A[r][c]='1'
A[nr][nc]='1'
如果A[i][j]='1'

应该是
A[r][c]=1
A[nr][nc]==1
如果A[i][j]==1

我不确定这之后它是否能正确解决问题,但这是当前的错误


您当前的代码只计算1的数量。
您应该通过将1更改为2来检查1是否被访问。
此外,您不必在每次调用dfs时都启动方向,您只需将其置于函数之外即可

directions = [(0,1), 
              (0,-1), 
              (-1,0),
              (1,0)]

def valid_direction(A, r, c):
    row = len(A)
    col = len(A[0])
    if r < 0 or c < 0 or r >= row or c >= col:
        return False
    else:
        return True

def dfs(A, r, c):
    A[r][c] = 2
    # Up down left and right 
    for d in directions:
        nr = r +d[0]
        nc = c + d[1]
        if valid_direction(A, nr, nc) and A[nr][nc] == 1:
            dfs(A, nr, nc)


def solution(A):
    if not A:
        return -1

    row = len(A)
    col = len(A[0])
    results = 0
    for i in range(row):
        for j in range(col):
            if A[i][j] == 1:
                dfs(A, i, j)
                results +=1
    return results
directions=[(0,1),
(0,-1), 
(-1,0),
(1,0)]
def有效_方向(A、r、c):
行=列(A)
col=len(A[0])
如果r<0或c<0或r>=行或c>=列:
返回错误
其他:
返回真值
def dfs(A、r、c):
A[r][c]=2
#上下左右
对于d方向:
nr=r+d[0]
nc=c+d[1]
如果有效_方向(A,nr,nc)和A[nr][nc]==1:
dfs(美国、北卡罗来纳州、北卡罗来纳州)
def溶液(A):
如果不是:
返回-1
行=列(A)
col=len(A[0])
结果=0
对于范围内的i(行):
对于范围内的j(列):
如果A[i][j]==1:
dfs(A、i、j)
结果+=1
返回结果

我不完全确定您想解决什么问题,但我认为正确的代码是这样的。

您能澄清一下您想要的结果是什么吗?您说,“我想找到所有岛中都有1的岛,以及它们是否连接(相邻单元格)。”但是,
solution()
只返回一个数字(即
结果
)。一个数字不能代表你的既定目标。请提供所需输出的示例。我通过添加此内容对其进行了编辑,因此我希望返回找到的孤岛数。您能否澄清您希望得到的结果?您说,“我想找到所有岛中都有1的岛,以及它们是否连接(相邻单元格)。”但是,
solution()
只返回一个数字(即
结果
)。一个数字不能代表你的既定目标。请提供所需输出的示例。我通过添加此命令对其进行了编辑,因此我希望返回找到的孤岛数。调用Python对象错误时,它似乎正在终止堆栈,并超过最大递归深度,但解决方案似乎奏效了you@MNM递归错误是因为使用原始代码时,相邻单元将无限地相互调用
dfs()
。很高兴它起到了作用。调用Python对象错误时,它似乎正在杀死超过最大递归深度的堆栈,但解决方案似乎很有效you@MNM递归错误是因为使用原始代码时,相邻单元将无限地相互调用
dfs()
。很高兴这有帮助。