输入一个正方形的矩阵,0表示墙,1表示路,请判断有没有走出该迷宫的路(默认从左上角进入,从右下角出)
如图所示,方阵中0代表墙,1代表路,找出走出迷宫路线:
1 1 0 1 1 1 1
0 1 0 1 0 1 0
0 1 1 1 0 1 0
0 1 0 0 1 1 0
0 1 1 1 1 0 1
0 0 1 0 0 0 1
1 1 1 1 1 1 1
0 1 1 0 0 0 1
1 0 1 0 0 0 1
解题思路,核心伪代码如下:
if 到达了目的地:
打印结果矩阵
else:
if 此位置已经走过了:
返回上一步
else:
尝试向四周走,递归此核心思路
# coding=utf-8
class Maze():
# 初始化迷宫的规格大小
def __init__(self, n):
self.n = n
# 初始化结果矩阵
self.flag = [[0 for _ in range(n)] for _ in range(n)]
# 判断位置是否合法,如果可以走,那么返回True,否则返回False
def isSafe(self, maze, x, y):
return x >= 0 and x <= self.n - 1 and y >= 0 and y <= self.n - 1 and maze[x][y] == 1
# 打印矩阵
def printSolution(self, flag):
for i in flag:
for j in i:
print('%4s' % str(j), end='')
print('\n')
# 获取走出迷宫的结果矩阵
def getPath(self, maze, x, y):
# 如果此处位置合法但是此处走过了,返回到上一步
if self.isSafe(maze, x, y) and self.flag[x][y] == '-':
return False
# 如果到达了目的地,返回True
if x == self.n - 1 and y == self.n - 1:
self.flag[x][y] = '-'
self.printSolution(self.flag)
return True
# 没有到达目的地,继续往下走
if self.isSafe(maze, x, y):
# 标记结果矩阵中当前位置为*(*表示行走的路线)
self.flag[x][y] = '-'
# 尝试向右走,递归
if self.getPath(maze, x + 1, y):
return True
# 尝试向下走,递归
if self.getPath(maze, x, y + 1):
return True
# 尝试向左走,递归
if self.getPath(maze, x - 1, y):
return True
# 尝试向上走,递归
if self.getPath(maze, x, y - 1):
return True
# 此路不通,标记当前的单元为0,表示此处不可能到达目的地,返回上一步
self.flag[x][y] = 0
return False
# 此位置不合法,返回False
return False
if __name__ == '__main__':
maze = [[1, 1, 0, 1, 1, 1, 1, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 1],
[0, 1, 1, 1, 0, 1, 0, 0, 0],
[0, 1, 0, 0, 1, 1, 0, 0, 0],
[0, 1, 1, 1, 1, 0, 1, 1, 1],
[0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 1],
[0, 1, 1, 0, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 0, 0, 1], ]
rat = Maze(len(maze))
ret = rat.getPath(maze, 0, 0)
if ret == False:
print("No solution!")
#原迷宫
[[1, 1, 0, 1, 1, 1, 1, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 1],
[0, 1, 1, 1, 0, 1, 0, 0, 0],
[0, 1, 0, 0, 1, 1, 0, 0, 0],
[0, 1, 1, 1, 1, 0, 1, 1, 1],
[0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 1],
[0, 1, 1, 0, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 0, 0, 1], ]
#输出答案
- - 0 0 0 0 0 0 0
0 - 0 0 0 0 0 0 0
0 - 0 0 0 0 0 0 0
0 - 0 0 0 0 0 0 0
0 - - 0 0 0 - - -
0 0 - 0 0 0 - 0 -
0 0 - - - - - 0 -
0 0 0 0 0 0 0 0 -
0 0 0 0 0 0 0 0 -