使用回溯的骑士之旅
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 那里得到答案,如果我能提供更多帮助,我会更新这个。
有人给了我一些初始化代码,让我写一个函数 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 那里得到答案,如果我能提供更多帮助,我会更新这个。