“自我”如何正确更新原始变量?N皇后问题中的递归/回溯(Python)

很烂

这是我解决8皇后问题的python程序。除了打印解决方案的电路板的最后一步之外,所有步骤都可以正常工作。我使用递归/回溯功能在木板上填入皇后,直到找到解决方案为止。拥有解决方案的电路板对象是self,这是对的引用b1,因此我假设将b1初始化的原始电路板更新为包含最终解决的电路板,并使用来打印解决方案printBoard但是,b1由于某种未知的原因,当我打印它时它没有被更新并且持有一块失败的电路板。

编辑:增加了placeQueensolve

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, col):

        if col == -1:
            return True

        for i in range(8):
            if self.board[i][col] == EMPTY:
                temp = self.copy()

                self.placeQueen(col, i)
                if self.solve(col - 1):
                    return True

                temp.board[i][col] = RESTRICTED
                self = temp.copy()

        return False

    # deep copies a board onto another board
    def copy(self):
        copy = Board()

        for i in range(8):
            for j in range (8):
                copy.board[j][i] = self.board[j][i]

        return copy


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

我知道我的实际求解器正在工作,因为当我添加printBoard如下代码时:

if col == -1:
    self.printBoard()
    return True

在该solve方法中,打印出已解决的板。简而言之,为什么self董事会实例未更新b1

TheKewlStore

我相信您的问题与在解决方法中重新定义自我有关,我什至不确定为什么要这样做。

有关更多详细信息,请参见此问题:用方法中的相同类型的另一个对象替换自身对象是否安全?

像执行操作那样重新分配自我不会重新分配“ b1”引用。因此,当您再次引用b1并执行printBoard时,您所引用的对象与“ self.printBoard()”将在求解完成时所引用的对象不同。

我会退后一步,问问自己,为什么您要取代自我,以及这样做有什么好处。您可能也不需要,也不应该这样做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在回溯中撤消?我在递归回溯方法上遇到问题

来自分类Dev

正确的递归回溯算法?

来自分类Dev

正确的递归回溯算法?

来自分类Dev

递归回溯,返回更新的值

来自分类Dev

Python递归回溯suduko求解器

来自分类Dev

Python中的递归回溯-平衡权重

来自分类Dev

递归回溯以生成迷宫

来自分类Dev

递归回溯的子集总和

来自分类Dev

递归回溯如何工作?电脑数独求解器

来自分类Dev

Python中的递归回溯-在规模上平衡权重

来自分类Dev

为什么我解决N个皇后区问题的回溯解决方案不起作用?

来自分类Dev

Python中的N皇后回溯:如何返回解决方案而不是打印解决方案?

来自分类Dev

Python中的N皇后回溯:如何返回解决方案而不是打印解决方案?

来自分类Dev

树状结构中的递归回溯

来自分类Dev

实施递归回溯器以生成迷宫

来自分类Dev

如何在子集回溯问题中返回正确的List <List <Integer >>

来自分类Dev

实现回溯N皇后算法

来自分类Dev

我们可以解决N个皇后区而无需回溯吗?以及如何计算回溯解决方案的复杂性?

来自分类Dev

Python回溯问题,达到最大递归深度

来自分类Dev

递归回溯算法无法解决某些情况

来自分类Dev

递归回溯迷宫有时会留下瓷砖

来自分类Dev

在随机生成的迷宫上使用递归回溯

来自分类Dev

使用递归回溯的C ++ Sudoku Solver无法正常工作

来自分类Dev

动画化javascript中的递归回溯算法

来自分类Dev

四色图定理递归回溯算法

来自分类Dev

8皇后问题如何在回溯算法正常工作时显示板上的放置位置

来自分类Dev

递归回溯打印长度为 N 的二进制数的所有组合而不使用循环

来自分类Dev

如何在python中保存“自我”变量?

来自分类Dev

Peewee自我保存问题(更新查询)

Related 相关文章

  1. 1

    如何在回溯中撤消?我在递归回溯方法上遇到问题

  2. 2

    正确的递归回溯算法?

  3. 3

    正确的递归回溯算法?

  4. 4

    递归回溯,返回更新的值

  5. 5

    Python递归回溯suduko求解器

  6. 6

    Python中的递归回溯-平衡权重

  7. 7

    递归回溯以生成迷宫

  8. 8

    递归回溯的子集总和

  9. 9

    递归回溯如何工作?电脑数独求解器

  10. 10

    Python中的递归回溯-在规模上平衡权重

  11. 11

    为什么我解决N个皇后区问题的回溯解决方案不起作用?

  12. 12

    Python中的N皇后回溯:如何返回解决方案而不是打印解决方案?

  13. 13

    Python中的N皇后回溯:如何返回解决方案而不是打印解决方案?

  14. 14

    树状结构中的递归回溯

  15. 15

    实施递归回溯器以生成迷宫

  16. 16

    如何在子集回溯问题中返回正确的List <List <Integer >>

  17. 17

    实现回溯N皇后算法

  18. 18

    我们可以解决N个皇后区而无需回溯吗?以及如何计算回溯解决方案的复杂性?

  19. 19

    Python回溯问题,达到最大递归深度

  20. 20

    递归回溯算法无法解决某些情况

  21. 21

    递归回溯迷宫有时会留下瓷砖

  22. 22

    在随机生成的迷宫上使用递归回溯

  23. 23

    使用递归回溯的C ++ Sudoku Solver无法正常工作

  24. 24

    动画化javascript中的递归回溯算法

  25. 25

    四色图定理递归回溯算法

  26. 26

    8皇后问题如何在回溯算法正常工作时显示板上的放置位置

  27. 27

    递归回溯打印长度为 N 的二进制数的所有组合而不使用循环

  28. 28

    如何在python中保存“自我”变量?

  29. 29

    Peewee自我保存问题(更新查询)

热门标签

归档