数据结构与算法--Python实现递归经典问题:Python实现迷宫回溯问题 Python实现八皇后问题

迷宫问题

  • 如下图:小球必须避开红色墙体移动,直到找到箭头所指的出口,请用代码实现
    在这里插入图片描述
思路

利用递归和回溯,递归的终止条件是假设已经移动到了出口位置,上图中箭头位置即是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值