python迷宫,显示所有走的路线,包括死路,用箭头显示所有正确路线


直接上代码


# 定义迷宫,1为通路,0为墙,网上的算法有问题,而且只能输出一种情况
# 经过我改编,该算法可以输出所有情况和可行的方法数,并且输出过程和每一种方法
# 此算法和判断洼地汇水区域算法有关,后者编写的依据是此算法
maze = [[1, 0, 1, 0, 0, 1, 1, 0, 1, 1],
        [1, 1, 1, 1, 1, 0, 1, 0, 0, 1],
        [0, 0, 1, 0, 1, 0, 1, 0, 0, 1],
        [0, 1, 1, 1, 1, 0, 1, 0, 0, 1],
        [0, 0, 1, 0, 1, 0, 1, 0, 1, 1],
        [1, 0, 0, 1, 1, 1, 1, 1, 0, 1],
        [1, 1, 1, 1, 1, 0, 1, 0, 0, 1],
        [1, 1, 0, 0, 1, 0, 1, 1, 1, 1],
        [1, 0, 1, 0, 1, 0, 1, 0, 1, 1],
        [1, 0, 1, 0, 1, 0, 1, 1, 0, 1]]
 
 
# 判断坐标的有效性,如果超出数组边界或是不满足值为1的条件,说明该点无效返回False,否则返回True。
def check(x, y):
    if y >= 0 and y < len(maze) and x >= 0 and x < len(maze[0]) and maze[y][x] == 1:
        return True
    else:
        return False
 
 
def walk(x, y):  # 走迷宫的算法
    global success, procedure_list, success_count  # 声明这些变量用全局的
 
    maze[y][x] = 0  # 已经走过需要标记,因为不能再走,否则兜圈子
    procedure_list.append((x, y))  # 过程列表加入该点坐标
    if x == 9 and y == 0:  # 如果到达终点(9,0)
        print("success")  # 输出“成功”
        success = 1  # 表示能走通
        success_count += 1  # 成功的方法数增加1
        success_procedure_ls.append(list(procedure_list))  # 保存成功路径
        procedure_list.remove((x, y))
        maze[y][x] = 1  # 设为通路
        return True
    if maze[y][x] == 0:
        print("第{}行,第{}列".format(y + 1, x + 1))
        for pos_y, pos_x in pos_ls:
            if check(x + pos_x, y + pos_y): break
        else:
            print("死路")
    if success < 100:
 
        for pos_y, pos_x in pos_ls:
 
            if check(x + pos_x, y + pos_y):
                walk(x + pos_x, y + pos_y)
 
        maze[y][x] = 1
        procedure_list.remove((x, y))
 
    return success
 
 
procedure_list = []
success = 0  # 是否成功
success_procedure_ls = []  # 成功方法的列表
success_count = 0  # 成功方法数,初始为0
pos_ls = [(0, -1), (-1, 0), (0, 1), (1, 0)]  # 分别代表上,左,下,右
walk(0, 9)  # 从(0,9)出发
# print(procedure_list)
 
 
# for way in success_procedure_ls:
#     print(way)
maze_copy = list(maze)  # 一个迷宫的浅复制(最外层为深复制)
 
x, y = 0, 1  # x代表横坐标,y代表纵坐标
n_way = 0
for way in success_procedure_ls:
    i = 0
    n_way += 1
    print("第{}种方法:".format(n_way))
    print(way)  # 输出方法
    for line in maze_copy:
        maze[i] = list(maze_copy[i])  # 一个迷宫的深复制
        i += 1  # i指向下一行
    for index in range(len(way) - 1):  # 把每一步转化为箭头
        if way[index + 1][x] == way[index][x] - 1:
            maze[way[index][y]][way[index][x]] = "←"
        elif way[index + 1][x] == way[index][x] + 1:
            maze[way[index][1]][way[index][0]] = "→"
        elif way[index + 1][y] == way[index][y] - 1:
            maze[way[index][y]][way[index][x]] = "↑"
        elif way[index + 1][y] == way[index][y] + 1:
            maze[way[index][1]][way[index][0]] = "↓"
    for row in maze:
        for item in row:
            if item not in [0, 1]:
                print(item, end='')
            else:
                print(str(item) + ' ', end='')
        print()
    print('*  ' * 100)  # 分开每一种方法
print("一共{}中方法".format(success_count))  # 输出方法数

运行结果

D:\Users\jjh\AppData\Local\Programs\Python\Python35\python.exe D:/Users/jjh/PycharmProjects/untitled/maze_new.py
第10行,第1列
第9行,第1列
第8行,第1列
第7行,第1列
第6行,第1列
死路
第7行,第2列
第7行,第3列
第7行,第4列
第6行,第4列
第6行,第5列
第5行,第5列
第4行,第5列
第4行,第4列
第4行,第3列
第4行,第2列
死路
第3行,第3列
第2行,第3列
第2行,第2列
第2行,第1列
第1行,第1列
死路
第1行,第3列
死路
第2行,第4列
第2行,第5列
第3行,第5列
死路
第5行,第3列
死路
第3行,第5列
第2行,第5列
第2行,第4列
第2行,第3列
第2行,第2列
第2行,第1列
第1行,第1列
死路
第1行,第3列
死路
第3行,第3列
第4行,第3列
第4行,第2列
死路
第4行,第4列
死路
第5行,第3列
死路
第6行,第6列
第6行,第7列
第5行,第7列
第4行,第7列
第3行,第7列
第2行,第7列
第1行,第7列
第1行,第6列
死路
第6行,第8列
死路
第7行,第7列
第8行,第7列
第8行,第8列
第8行,第9列
第8行,第10列
第7行,第10列
第6行,第10列
第5行,第10列
第5行,第9列
死路
第4行,第10列
第3行,第10列
第2行,第10列
success
第9行,第10列
第9行,第9列
死路
第10行,第10列
死路
第9行,第9列
第9行,第10列
第8行,第10列
第7行,第10列
第6行,第10列
第5行,第10列
第5行,第9列
死路
第4行,第10列
第3行,第10列
第2行,第10列
success
第10行,第10列
死路
第9行,第7列
第10行,第7列
第10行,第8列
死路
第7行,第5列
第8行,第5列
第9行,第5列
第10行,第5列
死路
第7行,第5列
第6行,第5列
第6行,第4列
死路
第5行,第5列
第4行,第5列
第4行,第4列
第4行,第3列
第4行,第2列
死路
第3行,第3列
第2行,第3列
第2行,第2列
第2行,第1列
第1行,第1列
死路
第1行,第3列
死路
第2行,第4列
第2行,第5列
第3行,第5列
死路
第5行,第3列
死路
第3行,第5列
第2行,第5列
第2行,第4列
第2行,第3列
第2行,第2列
第2行,第1列
第1行,第1列
死路
第1行,第3列
死路
第3行,第3列
第4行,第3列
第4行,第2列
死路
第4行,第4列
死路
第5行,第3列
死路
第6行,第6列
第6行,第7列
第5行,第7列
第4行,第7列
第3行,第7列
第2行,第7列
第1行,第7列
第1行,第6列
死路
第6行,第8列
死路
第7行,第7列
第8行,第7列
第8行,第8列
第8行,第9列
第8行,第10列
第7行,第10列
第6行,第10列
第5行,第10列
第5行,第9列
死路
第4行,第10列
第3行,第10列
第2行,第10列
success
第9行,第10列
第9行,第9列
死路
第10行,第10列
死路
第9行,第9列
第9行,第10列
第8行,第10列
第7行,第10列
第6行,第10列
第5行,第10列
第5行,第9列
死路
第4行,第10列
第3行,第10列
第2行,第10列
success
第10行,第10列
死路
第9行,第7列
第10行,第7列
第10行,第8列
死路
第8行,第5列
第9行,第5列
第10行,第5列
死路
第8行,第2列
死路
第8行,第2列
第7行,第2列
第7行,第1列
第6行,第1列
死路
第7行,第3列
第7行,第4列
第6行,第4列
第6行,第5列
第5行,第5列
第4行,第5列
第4行,第4列
第4行,第3列
第4行,第2列
死路
第3行,第3列
第2行,第3列
第2行,第2列
第2行,第1列
第1行,第1列
死路
第1行,第3列
死路
第2行,第4列
第2行,第5列
第3行,第5列
死路
第5行,第3列
死路
第3行,第5列
第2行,第5列
第2行,第4列
第2行,第3列
第2行,第2列
第2行,第1列
第1行,第1列
死路
第1行,第3列
死路
第3行,第3列
第4行,第3列
第4行,第2列
死路
第4行,第4列
死路
第5行,第3列
死路
第6行,第6列
第6行,第7列
第5行,第7列
第4行,第7列
第3行,第7列
第2行,第7列
第1行,第7列
第1行,第6列
死路
第6行,第8列
死路
第7行,第7列
第8行,第7列
第8行,第8列
第8行,第9列
第8行,第10列
第7行,第10列
第6行,第10列
第5行,第10列
第5行,第9列
死路
第4行,第10列
第3行,第10列
第2行,第10列
success
第9行,第10列
第9行,第9列
死路
第10行,第10列
死路
第9行,第9列
第9行,第10列
第8行,第10列
第7行,第10列
第6行,第10列
第5行,第10列
第5行,第9列
死路
第4行,第10列
第3行,第10列
第2行,第10列
success
第10行,第10列
死路
第9行,第7列
第10行,第7列
第10行,第8列
死路
第7行,第5列
第8行,第5列
第9行,第5列
第10行,第5列
死路
第7行,第5列
第6行,第5列
第6行,第4列
死路
第5行,第5列
第4行,第5列
第4行,第4列
第4行,第3列
第4行,第2列
死路
第3行,第3列
第2行,第3列
第2行,第2列
第2行,第1列
第1行,第1列
死路
第1行,第3列
死路
第2行,第4列
第2行,第5列
第3行,第5列
死路
第5行,第3列
死路
第3行,第5列
第2行,第5列
第2行,第4列
第2行,第3列
第2行,第2列
第2行,第1列
第1行,第1列
死路
第1行,第3列
死路
第3行,第3列
第4行,第3列
第4行,第2列
死路
第4行,第4列
死路
第5行,第3列
死路
第6行,第6列
第6行,第7列
第5行,第7列
第4行,第7列
第3行,第7列
第2行,第7列
第1行,第7列
第1行,第6列
死路
第6行,第8列
死路
第7行,第7列
第8行,第7列
第8行,第8列
第8行,第9列
第8行,第10列
第7行,第10列
第6行,第10列
第5行,第10列
第5行,第9列
死路
第4行,第10列
第3行,第10列
第2行,第10列
success
第9行,第10列
第9行,第9列
死路
第10行,第10列
死路
第9行,第9列
第9行,第10列
第8行,第10列
第7行,第10列
第6行,第10列
第5行,第10列
第5行,第9列
死路
第4行,第10列
第3行,第10列
第2行,第10列
success
第10行,第10列
死路
第9行,第7列
第10行,第7列
第10行,第8列
死路
第8行,第5列
第9行,第5列
第10行,第5列
死路
第1种方法:
[(0, 9), (0, 8), (0, 7), (0, 6), (1, 6), (2, 6), (3, 6), (3, 5), (4, 5), (5, 5), (6, 5), (6, 6), (6, 7), (7, 7), (8, 7), (9, 7), (9, 6), (9, 5), (9, 4), (9, 3), (9, 2), (9, 1), (9, 0)]
1 0 1 0 0 1 1 0 1 1 
1 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 00 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 11 0 0 →→→↓1 0 ↑
→→→↑1 00 0 ↑
↑1 0 0 1 0 →→→↑
↑0 1 0 1 0 1 0 1 10 1 0 1 0 1 1 0 1 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *2种方法:
[(0, 9), (0, 8), (0, 7), (0, 6), (1, 6), (2, 6), (3, 6), (3, 5), (4, 5), (5, 5), (6, 5), (6, 6), (6, 7), (7, 7), (8, 7), (8, 8), (9, 8), (9, 7), (9, 6), (9, 5), (9, 4), (9, 3), (9, 2), (9, 1), (9, 0)]
1 0 1 0 0 1 1 0 1 1 
1 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 00 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 11 0 0 →→→↓1 0 ↑
→→→↑1 00 0 ↑
↑1 0 0 1 0 →→↓↑
↑0 1 0 1 0 1 0 →↑
↑0 1 0 1 0 1 1 0 1 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *3种方法:
[(0, 9), (0, 8), (0, 7), (0, 6), (1, 6), (2, 6), (3, 6), (4, 6), (4, 5), (5, 5), (6, 5), (6, 6), (6, 7), (7, 7), (8, 7), (9, 7), (9, 6), (9, 5), (9, 4), (9, 3), (9, 2), (9, 1), (9, 0)]
1 0 1 0 0 1 1 0 1 1 
1 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 00 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 11 0 0 1 →→↓1 0 ↑
→→→→↑00 0 ↑
↑1 0 0 1 0 →→→↑
↑0 1 0 1 0 1 0 1 10 1 0 1 0 1 1 0 1 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *4种方法:
[(0, 9), (0, 8), (0, 7), (0, 6), (1, 6), (2, 6), (3, 6), (4, 6), (4, 5), (5, 5), (6, 5), (6, 6), (6, 7), (7, 7), (8, 7), (8, 8), (9, 8), (9, 7), (9, 6), (9, 5), (9, 4), (9, 3), (9, 2), (9, 1), (9, 0)]
1 0 1 0 0 1 1 0 1 1 
1 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 00 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 11 0 0 1 →→↓1 0 ↑
→→→→↑00 0 ↑
↑1 0 0 1 0 →→↓↑
↑0 1 0 1 0 1 0 →↑
↑0 1 0 1 0 1 1 0 1 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *5种方法:
[(0, 9), (0, 8), (0, 7), (1, 7), (1, 6), (2, 6), (3, 6), (3, 5), (4, 5), (5, 5), (6, 5), (6, 6), (6, 7), (7, 7), (8, 7), (9, 7), (9, 6), (9, 5), (9, 4), (9, 3), (9, 2), (9, 1), (9, 0)]
1 0 1 0 0 1 1 0 1 1 
1 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 00 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 11 0 0 →→→↓1 01 →→↑1 00 0 ↑
→↑0 0 1 0 →→→↑
↑0 1 0 1 0 1 0 1 10 1 0 1 0 1 1 0 1 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *6种方法:
[(0, 9), (0, 8), (0, 7), (1, 7), (1, 6), (2, 6), (3, 6), (3, 5), (4, 5), (5, 5), (6, 5), (6, 6), (6, 7), (7, 7), (8, 7), (8, 8), (9, 8), (9, 7), (9, 6), (9, 5), (9, 4), (9, 3), (9, 2), (9, 1), (9, 0)]
1 0 1 0 0 1 1 0 1 1 
1 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 00 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 11 0 0 →→→↓1 01 →→↑1 00 0 ↑
→↑0 0 1 0 →→↓↑
↑0 1 0 1 0 1 0 →↑
↑0 1 0 1 0 1 1 0 1 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *7种方法:
[(0, 9), (0, 8), (0, 7), (1, 7), (1, 6), (2, 6), (3, 6), (4, 6), (4, 5), (5, 5), (6, 5), (6, 6), (6, 7), (7, 7), (8, 7), (9, 7), (9, 6), (9, 5), (9, 4), (9, 3), (9, 2), (9, 1), (9, 0)]
1 0 1 0 0 1 1 0 1 1 
1 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 00 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 11 0 0 1 →→↓1 01 →→→↑00 0 ↑
→↑0 0 1 0 →→→↑
↑0 1 0 1 0 1 0 1 10 1 0 1 0 1 1 0 1 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *8种方法:
[(0, 9), (0, 8), (0, 7), (1, 7), (1, 6), (2, 6), (3, 6), (4, 6), (4, 5), (5, 5), (6, 5), (6, 6), (6, 7), (7, 7), (8, 7), (8, 8), (9, 8), (9, 7), (9, 6), (9, 5), (9, 4), (9, 3), (9, 2), (9, 1), (9, 0)]
1 0 1 0 0 1 1 0 1 1 
1 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 00 1 1 1 1 0 1 0 00 0 1 0 1 0 1 0 11 0 0 1 →→↓1 01 →→→↑00 0 ↑
→↑0 0 1 0 →→↓↑
↑0 1 0 1 0 1 0 →↑
↑0 1 0 1 0 1 1 0 1 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
一共8中方法

进程已结束,退出代码0

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值