recursion - 使用回溯的骑士之旅
问题描述
我得到了一些初始化代码,并被告知要编写一个函数 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 上运行,只是需要更长的时间。您可能必须实施一些算法改进以使其更快。无论如何,我发现的错误是:
您正在寻找电路板,但您只返回一帧。您需要对其进行设置,以便在找到电路板时,代码会一直返回它。
尝试替换以下行:
knight(n+1,y1,x1)
具有以下内容:
sol = knight(n+1,y1,x1)
if sol is not None:
return sol
我将尝试从 8x8 获得答案,如果我能提供更多帮助,请更新此内容。
推荐阅读
- kotlin - 是否可以在 Kotlin 中使用 vararg 实现序列编程?
- powershell - Invoke-RestMethod 等效于 curl 的 --connect-to?
- php - 数据库的免费主机
- json - Delphi 7中的Json图像数组
- javascript - Vanilla JS - 制作静态图表
- java - ConcurrentHashMap 删除方法线程安全
- listview - 我们可以将 WM_POINTERDOWN 消息添加到窗口 win32 ListView 控件吗?
- python - PyQt5 PushButton Hover 函数调用
- git - 我不想暂存/提交的子模块发生了变化。不幸的是,我无法恢复它。我应该怎么办?
- email - 自定义 VF 电子邮件跟踪不跟踪电子邮件打开