【问题标题】:How to terminate backtracing recursion after first solution is found找到第一个解决方案后如何终止回溯递归
【发布时间】:2017-02-19 03:09:34
【问题描述】:

我正在尝试寻找回溯 nQueen 算法的第一个解决方案。我想在找到第一个解决方案后终止代码的执行。但程序会一直运行,直到找到所有解决方案。

这是我的代码:

def nQueenBackTrack_first_solution(self, row, n):
      i = 0
      while i < n:
        if self.isTheQueenSafe(row , i):
          self.board[row][i] = "Q"
          if row == n - 1:
            self.print_the_board()
            break
          else:
            self.nQueenBackTrack(row + 1, n)
          self.board[row][i] = "."
        i += 1

这会继续打印所有解决方案。我只需要第一个解决方案。你也可以看看这个程序中使用的其他方法。

def isTheQueenSafe(self, row,col):
        for i in range(self.N):
                    # check horizontal Queens
                    if self.does_board_has_a_queen_at(row,i) or self.does_board_has_a_queen_at(i, col):
                        return False
                    # check diagonal Queens
                    s = row + col
                    k = row - col
                    for x in range(self.N):
                        for y in range(self.N):
                            if x + y == s and self.board[x][y] == "Q":
                                return False
                            if x - y == k and self.board[x][y] == "Q":
                                return False        
        return True

def does_board_has_a_queen_at(self,row,col):
    return self.board[row][col] == 'Q'


def print_the_board(self):
    print("solution:")
    for val in self.board:
        print (val, "\n")

但是我面临的主要问题是我需要在执行第一个解决方案后终止。如果有人能帮我解决这个问题,那就太好了。

【问题讨论】:

  • 找到第一个解决方案后,使用全局变量并将其设置为 True。或者通过你的所有函数传递这个布尔值。

标签: algorithm python-3.x recursion n-queens


【解决方案1】:

从任意深度展开堆栈的一种方法是使用异常:

自定义异常:

class DoneEarly(Exception):
    """An exception to unwind the stack"""

顶级方法:

def nQueenBackTrack(self, row, n):
    try:
        self._nQueenBackTrack(row, n)
    except DoneEarly:
        pass

以前的顶级方法:

递归方法现在是私有的,并在完成时引发自定义异常:

def _nQueenBackTrack(self, row, n):
    i = 0
    while i < n:
        if self.isTheQueenSafe(row, i):
            self.board[row][i] = "Q"
            if row == n - 1:
                self.print_the_board()
                raise DoneEarly
            self._nQueenBackTrack(row + 1, n)
            self.board[row][i] = "."
        i += 1

注意:我无法对此进行测试。

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    相关资源
    最近更新 更多