题目:一只老鼠在一个nxn迷宫的入口,他想要吃掉迷宫出口处放着的奶酪,问这只老鼠能否吃到奶酪?如果可以吃到,请给出一条从入口到奶酪的路径。
思考:解决问题之前,我们需要找出已知条件和要得到什么,,和解数学问题和物理问题一样,先读懂题,这道题可以用数学模型充型定义。
数学模型:
这个问题:问老鼠能否吃到奶酪就是能否找到一条从迷宫入口到出口的路径,如果不能找到,老鼠就吃不到奶酪;如果能找到,那么就给出这条路径。
观察10x10的迷宫。这个迷宫就是由10x10=100个格子组成的,其中绿色格子代表墙,白色格子代表路,我们将这局话改为数学形式,用1表示墙,0表路,就可以得到一个新的二位数组,即:
m[10] [10]= [1,1,1,0,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,1,1],
[1,0,1,1,1,1,1,0,0,1],
[1,0,1,0,0,0,0,1,0,1],
[1,0,1,0,1,1,0,0,0,1],
[1,0,0,1,1,0,1,0,1,1],
[1,1,1,1,0,0,0,0,1,1],
[1,0,0,0,0,1,1,1,0,0],
[1,0,1,1,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1]
有了对迷宫的数学定义,就可以简单的定义迷宫的入口和出口了。迷宫的入口是m[0] [3],出口是m[7] [9] 。老鼠迷宫问题就是要找一条从入口到出口的路径;如果不存在,就返回不存在这种路径。也就是说,要在二维数组中找一条从m[0] [3]到m[7] [9]全部为0的路径。
我们用递归解决该问题:
python代码如下
def maze (m,n,route,pos,export):
'''
:param m: 迷宫数组,列表
:param n: 迷宫阶数
:param route: 可能的路线,列表
:param pos: 当前位置,元组
:param export: 出口位置,元组
'''
route.append(pos)
if pos ==export:
print(route)
if pos[0]>0 and m[pos[0]-1][pos[1]]==0 and (pos[0]-1,pos[1]) not in route :
maze(m,n,route[:],(pos[0]-1,pos[1]),export)
if pos[0]< n-1 and m[pos[0]+1][pos[1]]==0 and (pos[0]+1,pos[1]) not in route :
maze(m, n, route[:], (pos[0] +1 , pos[1]), export)
if pos[1]>0 and m[pos[0]][pos[1]-1]==0 and (pos[0],pos[1]-1) not in route :
maze(m, n, route[:], (pos[0], pos[1]-1), export)
if pos[1]<n-1 and m[pos[0]][pos[1]+1]==0 and (pos[0],pos[1]+1) not in route :
maze(m, n, route[:], (pos[0], pos[1]+1), export)
m=[
[1,1,1,0,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,1,1],
[1,0,1,1,1,1,1,0,0,1],
[1,0,1,0,0,0,0,1,0,1],
[1,0,1,0,1,1,0,0,0,1],
[1,0,0,1,1,0,1,0,1,1],
[1,1,1,1,0,0,0,0,1,1],
[1,0,0,0,0,1,1,1,0,0],
[1,0,1,1,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1]
]
maze(m,len(m),list(),(0,3),(7,9))
代码算法比较复杂,建议反复理解!
感谢观看!