[python]关于迷宫问题与递归调用的一些tips

来源:互联网 发布:淘宝买家差评如何修改 编辑:程序博客网 时间:2024/06/04 19:42

写在前面:
本来书上是用c做的,既然老师说他看得懂python,那我干脆拿python写咯~ 没想到对python语法生疏了,另外新学的递归调用还拎不清,调bug调了我半天时间(翻白眼)

只整理最重要的递归部分啦,我着急去食堂吃饭:

mymap:一个二维数组

trmanl: terminal 的简写(没错就是省略元音!),是一个自定义的结构体,表示一个笛卡尔坐标

x&y:起点坐标,可以直接写(1,1)

Status:判断起点到终点是否有通路的flag(没什么不直接return True呢?因为if语句居然不识别函数的返回值)


def move(mymap,x,y,trmnl):    global Status, path     mymap[x][y]=2

tip1. path是个list,我们拿它当栈来用。可通过的点压栈,是死路就出栈。


    if (x == trmnl.x)and(y == trmnl.y): #Reached the terminal point        print "SECCESS"        Status =  True    elif mymap[x + 1][y] == 0: #East        mymap[x][y] = 1        path.append((x,y))        #print(x,y)        move(mymap,x+1,y,trmnl)    elif mymap[x][y + 1] == 0: #South        mymap[x][y] = 1        path.append((x,y))        #print(x,y)        move(mymap,x,y+1,trmnl)    elif mymap[x - 1][y] == 0: #West        mymap[x][y] = 1        path.append((x,y))        #print(x,y)        move(mymap,x-1,y,trmnl)    elif mymap[x][y - 1] == 0:  #North        mymap[x][y] = 1        path.append((x,y))        #print(x,y)        move(mymap,x,y-1,trmnl)    elif x == 1 and y == 1:        print "NO ACCESS"        Status = False        return    else:        mymap[x][y] = 1        path.pop()#-------------------------------------------(1)        if (x == 1 and y == 2)or (x == 2 and y == 1):            print "NO ACCESS"            Status = False            return        move(mymap,path[-1][0],path[-1][1],trmnl)#------------(2)
tip2: 以上是判断四个方向是否可通过的结构。除了到达终点、被困起点和退栈的判断之外,其他操作都是【标记已走】>【该点压栈】>【看下一点是否可走】的顺序。当然在递归调用的时候,是先判断该点可走,再把上一点压栈的。也就是说,计算机得到的路径顺序是从终点到起点的。

tip3:当一条路是死路的时候,我们要把它退栈。假设从P-1点走到P点后,发现P点是死路,此时P点没有压栈,P-1点压栈了。我们要退回人在P-1点的状态,就要先把P点标记为死路(也就是置1)然后把P-1点退栈(1),重新从P-2点走到P-1点(2)。

tip4: 退栈时,如果P点是第二个路径点,P-1为起点,那么P-2就是不存在的,这个时候要判断一下P点是不是临近起点,是的话直接跳出这个函数就OK


所以我为什么调这么点东西用了这么长时间???? _(:з」∠)_

从食堂回来了,继续整理。

下面一个函数是随机生成迷宫的!

def SetUpRandomMaze():    #Set up a 15x15 maze and mark the border as 1    maze = np.zeros((15,15))#--------------------------------(1)    maze[0] = [1]    maze[14] = [1]    for i in range(1,14):        maze[i][0] = 1        maze[i][14] = 1    #Set up some random walls in the maze    for x in range(1,14):        for y in range(1,14):            #opportunity: 0:67%, 1:33%            maze[x][y] = random.choice([0,0,0,0,1,1])#-------(2)    #Make sure that starting point & terminal point are available    maze[1][1] = 0    maze[13][13] = 0    return maze

请忽略我惨不忍睹的英文语法,我在下面记录几个有意思的地方。

tip1: np.zeros是调用了python的一个库,叫numpy。zeros就是定义了一个零矩阵(浮点型),numpy里还有有关矩阵相乘等线性代数的内容。

(为什么我上线性代数课的时候没有早点知道这个库!)

 tip2:  random是python的另外一个库,提供随机函数的。random.choice会在它后面给的list里随机挑一个值返回给你。我这里搞了这么多0和1是因为要调整迷宫的难度。

好了,重点都记录完了~




原创粉丝点击