实施";“最小启发式”;在回溯算法中解决Python中的难题
我最近开始解决难题和递归/回溯。 我试图解决6x6摩天大楼的难题,其中包括根据提供给我们的具体线索填充一块6x6板。 我已经做了尽可能多的约束编程,但为了解决某些难题,我不得不诉诸暴力迫使结束 我的板中的一行退出约束函数的外观如下所示:实施";“最小启发式”;在回溯算法中解决Python中的难题,python,recursion,Python,Recursion,我最近开始解决难题和递归/回溯。 我试图解决6x6摩天大楼的难题,其中包括根据提供给我们的具体线索填充一块6x6板。 我已经做了尽可能多的约束编程,但为了解决某些难题,我不得不诉诸暴力迫使结束 我的板中的一行退出约束函数的外观如下所示: board=[[1,2,3,4,5],6[1,2,3,5,6],[1,2,4,5],[1,3],[2,3,4,5] 其中子列表是该特定单元的不同可能性。(因此,第一个子列表中的单元格可以是1、2、3、4或5) 我已经成功地实现了回溯蛮力方法,但希望尝试一种最小的
board=[[1,2,3,4,5],6[1,2,3,5,6],[1,2,4,5],[1,3],[2,3,4,5]
其中子列表是该特定单元的不同可能性。(因此,第一个子列表中的单元格可以是1、2、3、4或5)
我已经成功地实现了回溯蛮力方法,但希望尝试一种最小的启发式方法,例如优先考虑可能性最小的单元。
以下是我目前掌握的情况:
def search(searchBoard, clues):
findLeast = full(searchBoard)
if not findLeast:
return True
else:
row , col = findLeast
val = searchBoard[row][col]
for i in searchBoard[row][col]:
if is_valid(searchBoard, clues, 6, i, (row, col)):
searchBoard[row][col] = i
if search(searchBoard, clues):
return True
searchBoard[row][col] = val
return False
def full(puzzle):
try:
min = 0
for i in range(len(puzzle)):
for j in range(1 ,len(puzzle)):
if isinstance(puzzle[i][j] , list):
if len(puzzle[i][j-1]) < len(puzzle[i][j]):
min = len(puzzle[i][j-1])
pos = (i , j-1)
return pos
except TypeError:
return None
def搜索(搜索板、线索):
findLeast=已满(搜索板)
如果不是findLeast:
返回真值
其他:
行,列=findLeast
val=搜索板[行][列]
对于搜索板[行][列]中的i:
如果有效(搜索板,线索,6,i,(行,列)):
搜索板[行][col]=i
如果搜索(搜索板、线索):
返回真值
搜索板[行][col]=val
返回错误
def满(拼图):
尝试:
最小值=0
对于范围内的i(len(puzzle)):
对于范围(1,len(谜题))中的j:
如果存在(谜题[i][j],请列出):
如果len(拼图[i][j-1])
检查元素是否可以插入到特定单元格中
(在我的代码中编辑了一些语法错误)