目录
导言
乌龟探索迷宫这个问题与机器人领域也有关系,
如果我们有一个Roomba扫地机器人,我们或许可以利用乌龟探索迷宫这个问题的解决方法对扫地机器人进行重新编程.
解决过程
首先,要建立数据结构
1.建立数据结构
我们将整个迷宫的空间(矩形)分为行列整齐的方格,区分出墙壁和通道给每个方格具有行列位置,并赋予“墙壁”,"通道”的属性
考虑用矩阵方式来实现迷宫数据结构采用“数据项为字符列表的列表”这种两级列表的方式来保存方格内容
采用不同字符来分别代表“通道为空格 " ,“墙壁我为+”,“海龟投放点S"从一个文本文件逐行读入迷宫数据
2.探索迷宫:
算法思路
龟龟探索迷宫的递归算法思路如下
将海龟从原位置向北移动一步,以新位置递归调用探索迷宫寻找出口;
如果上面的步骤找不到出口,那么将海龟从原位置向南移动一步,以新位置递归调用探索迷宫:
如果向南还找不到出口,那么将海龟从原位置向西移动一步,以新位置递归调用探索迷宫;
如果向西还找不到出口,那么将海龟从原位置向东移动一步,以新位置递归调用探索迷宫;
如果上面四个方向都找不到出口,那么这个迷宫没有出口!
递归调用的“基本结束条件”
归纳如下 :
海龟碰到“墙壁”方格,递归调用结束,返回失败.
海龟碰到“面包屑”方格,表示此方格已访问过递归调用结束,返回失败.
海龟碰到“出口”方格,即“位于边缘的通道”方格,递归调用结束,返回成功!
海龟在四个方向上探索都失败,递归调用结束返回失败
3.乌龟走迷宫的实现代码:
import turtle
#迷宫搜索程序全局常量
START = "S" #--->起始位置
OBSTACLE = "+" #--->墙
TRIED = "." # 走过的路
DEAD_END = "-" # 死路
PART_OF_PATH = "0" # 走出迷宫的出口
#Maze类构造方法
class Maze:
def __init__(self,maze_filename):
with open(maze_filename,"r") as maze_file:
self.maze_list = [
[ch for ch in line.strip("\n")]
for line in maze_file.readlines()
]
self.rows_in_maze = len(self.maze_list)
self.columns_in_maze = len(self.maze_list[0])
for row_idx, row in enumerate(self.maze_list):
if START in row:
self.start_row = row_idx
self.start_col = row.index(START)
break
self.x_translate = -self.columns_in_maze / 2
self.y_translate = self.rows_in_maze / 2
self.t = turtle.Turtle()
self.t.shape("turtle")
self.wn = turtle.Screen()
self.wn.setworldcoordinates(
-(self.columns_in_maze - 1) / 2 - 0.5,
-(self.rows_in_maze - 1) / 2 - 0.5,
(self.columns_in_maze - 1) / 2 + 0.5,
(self.rows_in_maze - 1) / 2 + 0.5,
)
#Maze 类绘制方法
def draw_maze(self):
self.t.speed(10)
self.wn.tracer(0)
for y in range (self.rows_in_maze):
for x in range (self.columns_in_maze):
if self.maze_list[y][x] == OBSTACLE:
self.draw_centered_box(
x + self.x_translate,
-y + self.y_translate,
"orange",
)
self.t.color("black")
self.t.fillcolor("blue")
self.wn.update()
self.wn.tracer(1)
def draw_centered_box(self, x, y, color):
self.t.up()
self.t.goto(x - 0.5, y - 0.5)
self.t.color(color)
self.t.fillcolor(color)
self.t.setheading(90)
self.t.down()
self.t.begin_fill()
for i in range(4):
self.t.forward(1)
self.t.right(90)
self.t.end_fill()
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
* * *
**(1)Python所有方向的学习路线(新版)**
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。

**(2)Python学习视频**
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

**(3)100多个练手项目**
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

**(4)200多本电子书**
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
**(5)Python知识点汇总**
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。

**(6)其他资料**
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。

**这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**