好吧,自从我从事python工作以来已经很长时间了。但是基本上我在做经典的8难题问题,因此给定字符串“ 12-453786”,我的程序就可以将其解决为所需的“ 12345678-”。我正在使用广度优先搜索来解决当前问题,并在下面的示例中存储访问的节点和来自的节点。但是,要跟踪完成难题的实际路径或移动量,我需要能够从已求解的元组开始,并从元组列表追溯到起始状态
我当时正在考虑做一些解决的问题,== startstate循环,但这无法正常工作。
def breadth_first_search(puz):
qu = queue.Queue()
laststate=""
qu.put((puz, laststate))
startstate=puz
visited=[]
#visited[puz] = puz
while queue:
puz = qu.get()
visited.append(puz)
pos = puz[0].index('-')
nebs = neighborcells(pos)
#print(*visited)
if puz[0] == "12345678-":
break
else:
for i in nebs:
swapped=swap(puz,i,pos)
if swapped in visited:
pass #?
else:
qu.put((swapped, puz[0]))
#some sort of linked list like function to get the path of result to start
#here
访问节点示例(元组列表)
[('12-453786', ''),
('1-2453786', '12-453786'),
('12345-786', '12-453786'),
('-12453786', '1-2453786'),
('12-453786', '1-2453786'),
('1524-3786', '1-2453786'),
('1234-5786', '12345-786'),
('12345678-', '12345-786')]
这个特殊难题的预期结果应该是2个动作
答案 0 :(得分:0)
使用当前数据结构((nextState,prevState)元组的数组),您可以肯定地回到起始状态,但是效率不高,因为您每次都必须扫描整个列表以查找说明您要寻找的状态。相反,您可以使用简单的数据结构来存储BFS图。这样,当您到达结束状态时,您只需跟随反向链接即可到达初始状态。
在您当前的代码中,您也不防备以前访问过的状态,因此您可能会陷入无限循环的情况,而while循环永远不会中断。