使用回溯的骑士​​之旅

Knight's tour using backtracking

有人给了我一些初始化代码,让我写一个函数 knight(n,y,x) 来打印问题的解决方案。

这个初始化代码是

 size = 8
         board = []
         for y in range(size) :
             board = board + [[-1]*size]
         moves= [[1,2],[1,-2],[-1,2],[-1,-2],
                 [2,1],[2,-1],[-2,1],[-2,-1]]

到目前为止,我的代码似乎 运行 永远是

def knight(n,y,x):
    if n == 0:
        board[y][x] = 0
        n = 1
    elif n == (size**2) :
        return board
    for j,i in moves:
        y1 = y+j
        x1 = x+i
        if y1 < size and x1 < size and y1>=0 and x1>=0 and board[y1][x1] == -1:
            board[y1][x1] = n
            knight(n+1,y1,x1)
            board[y1][x1] = -1
    return

但我不明白为什么这是个问题。我已经查看了这里的一些现有问题,但它们使用了多种功能,而我们被告知只使用一个。有人可以帮忙吗?

我在你的代码中发现了一个问题,它修复了所有高达 7x7 板的问题。我 假设 它在 8x8 上工作,它只是需要成倍长的时间。您可能必须实施一些算法改进才能使其更快。不管怎样,我发现的错误是:

您找到了棋盘,但您只 return 它倒退了一帧。您需要对其进行设置,以便在找到电路板时,代码 return 一直返回。

尝试替换以下行:

knight(n+1,y1,x1)

具有以下内容:

sol = knight(n+1,y1,x1)
if sol is not None:
    return sol

我会试着从 8x8 那里得到答案,如果我能提供更多帮助,我会更新这个。