簡體   English   中英

遞歸到迭代 DFS python

[英]recursive to iterative DFS python

我正在嘗試將遞歸代碼轉換為迭代代碼。 任務是在網格中找到最大的區域(由單元組成的連接單元)。

代碼從這里引用: https://www.geeksforgeeks.org/find-length-largest-region-boolean-matrix/我嘗試使用堆棧和循環來替換遞歸,但它不起作用

這是我嘗試過的代碼,它不會重現與遞歸方法相同的結果。

我已經測試過

M = np.array([[0, 0, 1, 1, 0], [1, 0, 1, 1, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 2],[0, 0, 0, 1, 0],[0, 0, 3, 0, 0]]) 

def DFS(M, row, col, visited): 
    rowNbr = [-1, -1, -1, 0, 0, 1, 1, 1]  
    colNbr = [-1, 0, 1, -1, 1, -1, 0, 1]  

    # Mark this cell as visited  
    visited[row][col] = True
    stack = [] 

    for k in range(8): 
        if (isSafe(M, row + rowNbr[k],  
                   col + colNbr[k], visited)): 

            stack.push(M[row][col])
            row = row + rowNbr[k]
            col = col + colNbr[k]
            for k in range(8): 
                if (isSafe(M, row + rowNbr[k],  
                    col + colNbr[k], visited)):
                    stack.push(M[row][col])

使用堆棧的 DFS 的一般結構是

stack = [] # initialize Stack
visited = set() # initialize hash table for looking at visited nodes
stack.append(startNode) # put in the start node

while len(stack) != 0: # check whether there is anything in the To-Do list
   newNode = stack.pop() # get next node to visit
   if newNode not in visited: # update visited if this node has not been visited
      visited.add(newNode) 
   for neighbor in newNode.neighbors: # iterate over neighbors
      if neighbor not in visited: # check whether neighbors were visited
         stack.append(neighbor) # this node was not seen before, add it to To-Do list

在您的情況下,您似乎沒有使迭代次數取決於堆棧中是否還有一個元素,並且您沒有從堆棧中獲取下一個要訪問的元素,因為您沒有從中取出任何元素。

您可以嘗試以下方法:

def DFS(M, row, col, visited):
    rowNbr = [-1, -1, -1, 0, 0, 1, 1, 1]
    colNbr = [-1, 0, 1, -1, 1, -1, 0, 1]
    # initialize stack
    stack = [] 
    stack.append((row, col))
    while len(stack) != 0:
        row, col = stack.pop()
        if not visited[row, col]:
            visited[row, col] = 1
        # iterate over neighbors
        for k in range(8):
            if (isSafe(M, row + rowNbr[k], col + colNbr[k], visited)):
                row = row + rowNbr[k]
                col = col + colNbr[k]
                if not visited[row, col]:
                    stack.append((row, col))

這使用(row, col)的元組來標記位置並將它們存儲在堆棧中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM