毕业关:任意迷宫 · 机器人闯关
能不能写一段程序,解开它从没见过的迷宫?
课程目录为什么需要它
这是毕业关,要用上学过的全部内容:函数、while、if 和传感器。更重要的是,它引出算法 Algorithm 的概念:一个通用的方法,能解决一整类问题,而不只是某一道题。
直觉理解
在迷宫里迷路了?把右手贴在墙上,一直不要拿开,最后总能走出去(墙都连在一起的迷宫都行)。这就是右手法则 Right-hand rule。
对小码来说,「右手贴着墙」就是这样一步:
- 先右转(试着贴着墙走)。
- 前面挡住了,就左转,直到前面空。
- 向前走一步。
一直重复这一步,直到旗子。路上看到宝石就捡。
定义
算法 Algorithm
An algorithm is a finite, step-by-step method for solving a whole class of problems.算法是一套有限的、一步一步的方法,用来解决一整类问题。
示例
法则的一步
在互动课里运行运行一下,看小码怎样贴着右边的墙拐过弯。
def step():
turn_right()
while not front_clear():
turn_left()
move()
while not at_goal():
step()逐步执行
- L7还没到旗子:走一步。
- L2先试着右转。
- L3挡住了?左转,直到前面空。
- L5向前走一格。
- L7一直重复,拐过两个弯,直到旗子。
完整的迷宫
在互动课里运行同一个算法,再加上捡宝石。它也能解开练习里的迷宫。
def step():
turn_right()
while not front_clear():
turn_left()
move()
while not at_goal():
step()
if on_gem():
pick()逐步执行
- L8一直循环到旗子。
- L9按右手法则走一步。
- L10每走一步都检查有没有宝石。
常见错误
原地打转
如果小码四面都是墙,while not front_clear(): turn_left() 就停不下来。这里的地图都保证有出口。
检查旗子太晚
把 at_goal() 放在 while 的条件里,小码一到就会停下。
小测验
1. 小码最后停在哪里?
def step():
turn_right()
while not front_clear():
turn_left()
move()
step()
step()查看答案
答案:A
2. 为什么说右手法则是一个算法?
查看答案
答案:A
算法是通用的方法,而不是只针对一张地图的解法。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出跟着法则走
预测走三步之后小码停在哪里。
- 改需求别忘了宝石
这段程序能走到旗子,但把宝石落下了。改一改,让它在两张迷宫里都捡完宝石。
- 从零写毕业迷宫
从零写出完整的迷宫程序:一个按右手法则走一步的
step()函数,一个直到旗子的while循环,再加上捡宝石。3 个迷宫都要通关。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Algorithm | 算法 | A finite, step-by-step method that solves a whole class of problems. |
| Right-hand rule | 右手法则 | A maze algorithm: keep the wall on your right and follow it. |