有没有一种方法可以在python

时间:2019-10-13 18:40:50

标签: python list indexing linked-list tuples

好吧,自从我从事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个动作

1 个答案:

答案 0 :(得分:0)

使用当前数据结构((nextState,prevState)元组的数组),您可以肯定地回到起始状态,但是效率不高,因为您每次都必须扫描整个列表以查找说明您要寻找的状态。相反,您可以使用简单的数据结构来存储BFS图。这样,当您到达结束状态时,您只需跟随反向链接即可到达初始状态。

在您当前的代码中,您也不防备以前访问过的状态,因此您可能会陷入无限循环的情况,而while循环永远不会中断。