迷宫问题
- 如下图:小球必须避开红色墙体移动,直到找到箭头所指的出口,请用代码实现
思路
利用递归和回溯,递归的终止条件是假设已经移动到了出口位置,上图中箭头位置即是maze_map[6][5];在此基础上,约定从maze_map[1][1] 出发,按照:下 右 上 左 的行进策略移动小球,然后假设 第一个点是没有走过的,即它为0,然后假设 当前位置能走同,即标为2 那么 在2的位置 它可以走四个方向,先试探第一个约定的位置:向下走,此时用递归,不断去找路,如果能走通都标为2,直到走不通则原路返回,返回到第一个方向的递归处,再来试探 右,以此类推,直到能走到maze_map[6][5]位置!
Python实现
class Maze(object):
def __init__(self):
self.r = 0 # 统计有多少行
self.c = 0 # 统计有多少列
# 先用 二维数组模拟一个迷宫,墙体设为1,上下全部置为1
def print_maze(self, array_maze): # 打印迷宫地图
for row_item in array_maze:
for col_item in row_item:
print(col_item, end=" ")
print()
def create_maze(self):
row = 8
col = 7
maze_map = [[0 for i in range(col)] for j in range(row)]
self.r = len(maze_map) # 有多少行 8
self.c = len(maze_map[0]) # 有多少列 7
# 上下全部置为1 即墙体
for i in range(self.c): # 这应该是7 取0-6的值,因为变得是列
maze_map[0][i] = 1
maze_map[self.r - 1][i] = 1
# 左右全部置为1 即墙体
for j in range(1, self.r):
maze_map[j][0] = 1
maze_map[j][self.c - 1] = 1
# 设置挡板
maze_map[3][1] = 1
maze_map[3][2] = 1
# maze_map[1][2] = 1
# maze_map[2][2] = 1
return maze_map
# 利用递归和回溯为小球寻找路径
# 约定,row,col,表示从地图的哪个位置出发,约定从(1,1)出发,到(6,5)结束,则找到通路
# 当:maze_map [row][col] 为0 表示该点没有走过,为1则为墙,2表示通路可以走,3表示该路已经走过,但是走不通
# 策略:行进的方向:下 右 上 左 ,如果该点走不通则回溯
def find_way(self, maze_map, row, col):
"""
:param maze_map: 传入一张地图
:param row: 位置
:param col: 位置
:return: 如果找到通路就返回True,否则返回False
"""
if maze_map[self.r - 2][self.c - 2] == 2: # 最后一个位置如果2为通路,即递归的出口
return True
else:
if maze_map[row][col] == 0: # 如果当前这个点还没有走过,那按照策略:下 右 上 左 走
maze_map[row][col] = 2 # 假定该点是可以走通的
if self.find_way(maze_map, row + 1, col): # 向下走,行加1
return True
elif self.find_way(maze_map