Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中存储深度优先搜索的路径_Python_Data Structures - Fatal编程技术网

在python中存储深度优先搜索的路径

在python中存储深度优先搜索的路径,python,data-structures,Python,Data Structures,我试图为一个矩形网格写一个DFS,在这里,我从某个(x,y)坐标开始,必须到达目标坐标(xg,yg)。我需要我的函数来返回一个路径,它实际上是我所选择的方向的列表,比如 到目前为止,我的代码是这样的 我是python新手,如果有人能在这里帮助我,我将不胜感激。我的缩进有问题。此外,我也不太清楚DFS存储路径的逻辑。请帮忙 这里有一篇文章解释了。您要做的是如下操作,您有开始节点,在您的情况下(x,y),然后检查您访问的步骤是否已达到目标,即(xg,yg)深度优先搜索的方式是,它维护一个堆栈

我试图为一个矩形网格写一个DFS,在这里,我从某个(x,y)坐标开始,必须到达目标坐标(xg,yg)。我需要我的函数来返回一个路径,它实际上是我所选择的方向的列表,比如



到目前为止,我的代码是这样的




我是python新手,如果有人能在这里帮助我,我将不胜感激。我的缩进有问题。此外,我也不太清楚DFS存储路径的逻辑。请帮忙

这里有一篇文章解释了。您要做的是如下操作,您有
开始
节点,在您的情况下
(x,y)
,然后检查您访问的步骤是否已达到
目标,即
(xg,yg)
深度优先搜索的方式是,它维护一个堆栈,并将每个访问的节点推送到堆栈中,然后将它们弹出并检查其是否为目标。在您的程序中,您必须将检查步骤写入列表中。我希望教程链接能帮助您入门。

请正确缩进您的代码,以便我们能够遵循您的想法。您的所有代码片段是否都应该在
depthFirstSearch
中?希望这能清楚地说明问题。对不起,刚才的事!你的问题不太清楚。你的意思是当搜索到达死胡同时,路径需要包括回溯吗?@Gene:是的。。这就是问题所在。这里的问题是,假设我在节点(x,y)上,它有两个孩子(x1,y1)和(x2,y2),这两个孩子都不是目标状态。现在,当我转到(x1,y1)时,从那里我不能直接转到(x2,y2)。我首先需要返回到(x,y),然后再返回到(x2,y2)。尝试将x1,y1视为一个节点,在元组或两个元素列表中。当启用(x,y)时,可到达的状态是(x1,y1)和(x2,y2),因此将它们都推到堆栈中。现在你一次弹出一个,比如说(x1,y1),然后从那里寻找可到达的状态,然后继续“深度优先”。试试我指出的那个链接。不。我不是,已经忙着很多事情了。但让我来看看。:)让我们
action=['Up','Left','Left','Bottom']
def depthFirstSearch():
    visited=[]                # stores the vertices that I have visited  
    action=[]                 # this is what I have to return
    stack=Stack()             # the general stack used in DFS
    forward=Stack()           # stores the forward direction 
    reverse=Stack()           # stores the backward direction, in case we need to backtrack
    stack.push(getStartState())

    while not stack.isEmpty():
        tmp=stack.pop()
        if(GoalState(tmp)):
            return action
        if not tmp in visited:
            visited.append(tmp)
            if not forward.isEmpty():
                dirn=forward.pop()
                action.append(dirn)
                reverse.append(opposite(dirn))

        child1=getSuccessors(tmp)   # returns all the possible childs and direction as a list
        child2=[]

        for st in child1:
            if not st in visited:
                child2.append(st)

        if child2:
            for state in child2:
                stack.push(state[0])
                forward.push(state[1])
                reverse.push(oppposite(state[1])
        elif not child2:
            action.append(reverse.pop())