[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是因为要调整迷宫的难度。
好了,重点都记录完了~
- [python]关于迷宫问题与递归调用的一些tips
- 关于栈与递归求解迷宫与迷宫最短路径问题
- Tips-Anaconda与Python共存情况下,包的安装及调用语言冲突问题
- 迷宫问题递归与非递归求解
- 迷宫问题的递归求解
- 关于递归问题的一些小例子
- 关于Python的一些问题
- 栈与递归实现迷宫问题求
- 关于Python函数递归深度的问题
- 关于递归调用,函数指针,数组,字符串的一些理解
- 关于Fragment调用getActivity的一些问题
- 迷宫问题的非递归解
- 迷宫问题的非递归实现
- python 中 lambda的一些tips
- python中字典的一些tips
- [tips]关于rowid的一些内容
- 关于存储过程的一些tips
- [tips]关于rowid的一些内容
- sendEmptyMessageAtTime和sendEmptyMessageDelayed的区别
- HDU2066 一个人的旅行
- 奥斯特电流的磁效应及其实验
- 【java练习】扑克牌类的创建、洗牌
- ns2 常用网站
- [python]关于迷宫问题与递归调用的一些tips
- Ionic3 项目架构
- 基于TensorFlow的机器学习(2) -- 回归模型
- 基于java的设计模式(1)------策略模式
- 组合模式(Composite Pattern)——管理良好的集合
- Java并发性和多线程介绍、优缺点
- Java基础部分总结
- 导入Liferay项目
- Linkit ONE开发板实验03-串口打印GPS数据