Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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
n皇后问题中的回溯和递归(Python)_Python_Recursion_Backtracking_N Queens - Fatal编程技术网

n皇后问题中的回溯和递归(Python)

n皇后问题中的回溯和递归(Python),python,recursion,backtracking,n-queens,Python,Recursion,Backtracking,N Queens,我正在编写一个python类来找到8皇后问题的解决方案。如何在solve方法中正确实现回溯?我认为递归应该可以工作,但是,在第一次尝试没有找到解决方案后,程序停止,并且不会发生回溯。所有助手方法都能正常工作 EMPTY = 0 QUEEN = 1 RESTRICTED = 2 class Board: # initializes a 8x8 array def __init__ (self): self.board = [[EMPTY for x in ran

我正在编写一个python类来找到8皇后问题的解决方案。如何在
solve
方法中正确实现回溯?我认为递归应该可以工作,但是,在第一次尝试没有找到解决方案后,程序停止,并且不会发生回溯。所有助手方法都能正常工作

EMPTY = 0
QUEEN = 1
RESTRICTED = 2

class Board:

    # initializes a 8x8 array
    def __init__ (self):
        self.board = [[EMPTY for x in range(8)] for y in range(8)]

    # pretty prints board
    def printBoard(self):
        for row in self.board:
            print(row)

    # places a queen on a board
    def placeQueen(self, x, y):
        # restricts row
        self.board[y] = [RESTRICTED for i in range(8)]

        # restricts column
        for row in self.board:
            row[x] = RESTRICTED

        # places queen
        self.board[y][x] = QUEEN

        self.fillDiagonal(x, y, 0, 0, -1, -1)   # restricts top left diagonal
        self.fillDiagonal(x, y, 7, 0, 1, -1)    # restructs top right diagonal
        self.fillDiagonal(x, y, 0, 7, -1, 1)    # restricts bottom left diagonal
        self.fillDiagonal(x, y, 7, 7, 1, 1)     # restricts bottom right diagonal

    # restricts a diagonal in a specified direction
    def fillDiagonal(self, x, y, xlim, ylim, xadd, yadd):
        if x != xlim and y != ylim:
            self.board[y + yadd][x + xadd] = RESTRICTED
            self.fillDiagonal(x + xadd, y + yadd, xlim, ylim, xadd, yadd)

    # recursively places queens such that no queen shares a row or
    # column with another queen, or in other words, no queen sits on a
    # restricted square. Should solve by backtracking until solution is found.
    def solve(self, queens):
        if queens == 8:
            return True

        for i in range(8):
            if self.board[i][queens] == EMPTY:
                self.placeQueen(queens, i)

                if self.solve(queens - 1):
                    return True

                self.board[i][queens] = RESTRICTED

        return False

b1 = Board()
b1.solve(7)
b1.printBoard()

我的问题是在添加queen之前缺少板的深度副本,还是只是缺少回溯?

两者都有:整个程序中只有一个板副本。你尽可能地填满它,直到所有的方块都被占据或限制;搜索失败,您从
solve
返回。由于没有重置电路板的机制,程序将结束


回溯将使这变得简单,代价是多个中间板。而不是有一个单一的董事会对象。。。制作一个深度副本,放置皇后,标记适当的限制方块,并将修改后的副本传递到下一个级别。如果你返回失败,让副本自然蒸发,成为局部变量。

当我运行此程序时,我只得到一个网格,在所有64个点上都有
2
。是的,这是我的问题——当第一次尝试找到解决方案时填充了电路板,但没有找到任何结果时,所有的方块都会受到限制。