似乎无法为无墙迷宫创建递归算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了似乎无法为无墙迷宫创建递归算法相关的知识,希望对你有一定的参考价值。

我一直在研究这个问题,这是我到目前为止所做的...这段代码不起作用。此代码仅供参考。任务是一个没有围墙的迷宫。我必须使用递归算法。每个空间都有一个数字,当我降落在一个空间时,这个数字告诉我我能在特定方向上移动多少。我必须回到路上。 (如果有解决方案,我已经做了我返回True或False的版本。)我似乎无法返回路径本身。

def pathsolve(self, start, end, vis=None):


    z=self.__getitem__(start)
    x,y=start




    b=False

    if path==None:
        path=deque()

    if vis==None:
        vis=deque()

    if start == end:
        vis.appendleft(start)
        return True
    elif start in path:
        return False
    elif z==0:
        return False
    else:
        #visited.add(start)
        path.append(start)


        if self.onboard((x+z,y)) and (x+z,y) not in path:
            #print("going to"+str((x+z,y))+" by "+str(z)+" from "+str    (start))
            b=self.pathsolve((x+z,y),end, path)

            #print()
        if self.onboard((x,y+z)) and (x,y+z) not in path and b == False:
            #print("xgoing to"+str((x,y+z))+" by "+str(z)+" from "+str(start))
            b=self.pathsolve((x,y+z),end, path)

            #print()
        if self.onboard((x,y-z)) and (x,y-z) not in path and b == False:
            #print("ygoing to"+str((x,y-z))+" by "+str(z)+" from "+str(start))
            #print(self.onboard((x,y-z)))
            b=self.pathsolve((x,y-z),end, path)
            #print(path)
        if self.onboard((x-z,y)) and (x-z,y) not in path and b == False:
            #print("zgoing to"+str((x-z,y))+" by "+str(z)+" from "+str(start))
            #print(end)
            b=self.pathsolve((x-z,y),end, path)

       # if b==True and start is not  
            vis.appendleft(start)
    return b
答案

有些事情需要注意:

  • vis如何作为参数传递并且需要在整个递归搜索中保持其状态相反,这不是path应该如何工作:它应该是一个局部变量,只接受递归调用的返回值并预先设置当前单元格(start) )它。
  • vis不应该是deque,而是set,它更适合快速了解之前是否访问过一个细胞。

以下是您可以编写代码的方法:

def pathsolve(self, start, end, vis=set()):
    z=self.__getitem__(start)
    x,y=start
    if start == end:
        return [end]
    if start in vis or z==0:
        return None
    vis.add(start)
    for step in [(x+z,y),(x-z,y),(x,y+z),(x,y-z)]:
        if self.onboard(step):
            path=self.pathsolve(step, end, vis)
            if path: # prepend current cell to the path that was found
                return [start] + path
    return None # None of the possible directions led to the end point.

当然,这假定您的其他方法已得到很好的实施。

看它在repl.it上运行。

对于以下迷宫:

[
    [1,1,2,0,0],
    [3,1,0,1,3],
    [1,0,2,0,2]
]

...从左下角开始,瞄准右上角,它给出了(x,y)坐标的路径(x =列,y =行):

[(0, 2), (0, 1), (3, 1), (4, 1), (1, 1), (1, 0), (2, 0), (4, 0)]

以上是关于似乎无法为无墙迷宫创建递归算法的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法递归——迷宫找路

数据结构和算法--5递归(迷宫问题和八皇后问题)

使用递归的迷宫深度优先路径算法

帆布迷宫游戏流畅的动画

Java数据结构之回溯算法的递归应用迷宫的路径问题

在随机生成的迷宫上使用递归回溯