首页 > 其他 > 详细

深搜dfs求解迷宫问题

时间:2020-10-05 23:04:57      阅读:38      评论:0      收藏:0      [点我收藏+]

深搜dfs求解迷宫问题

  • 需要确定起点和终点
    技术分享图片

基本模板

"""
# @Time    :  2020/10/5
# @Author  :  Jimou Chen
"""
# 迷宫二维列表 n行m列 :[[0 for i in range(m)] for j in range(n)]
# 假设1 是空地,2 是障碍物
a = [[0 for i in range(10)] for j in range(10)]
# 标志是否访问, 0是未访问,1是已经访问
flag = [[0 for i in range(10)] for j in range(10)]
# 目标坐标
# p, q = 0, 0
# 设最短路径长度
min_dis = 99999999


def dfs(x, y, step):
    if x == p and y == q:
        global min_dis
        if step < min_dis:
            min_dis = step
        # 回退
        return

    ‘‘‘顺时针试探‘‘‘
    # 右边
    if a[x][y + 1] == 1 and flag[x][y + 1] == 0:
        flag[x][y + 1] = 1
        dfs(x, y + 1, step + 1)
        flag[x][y + 1] = 0
    # 下
    if a[x + 1][y] == 1 and flag[x + 1][y] == 0:
        flag[x + 1][y] = 1
        dfs(x + 1, y, step + 1)
        flag[x + 1][y] = 0
    # 左
    if a[x][y - 1] == 1 and flag[x][y - 1] == 0:
        flag[x][y - 1] = 1
        dfs(x, y - 1, step + 1)
        flag[x][y - 1] = 0
    # 上
    if a[x - 1][y] == 1 and flag[x - 1][y] == 0:
        flag[x - 1][y] = 1
        dfs(x - 1, y, step + 1)
        flag[x - 1][y] = 0

    return


if __name__ == ‘__main__‘:
    # 输入m行n列
    m, n = map(int, input().split())
    # 给地图赋值,空地、障碍物
    for i in range(0, m):
        temp = list(map(int, input().split()))
        for j in range(0, n):
            # a[i][j] = int(input())
            a[i][j] = temp[j]

    # 输入起点和终点坐标
    start_x, start_y = map(int, input().split())
    # global p, q
    p, q = map(int, input().split())

    # 从起点开始,所以起点设置为已经访问状态
    flag[start_x][start_y] = 1
    dfs(start_x, start_y, 0)

    print(min_dis)

‘‘‘
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
0 0
3 2
‘‘‘

优化后的模板

  • 添加方向数组
"""
# @Time    :  2020/10/5
# @Author  :  Jimou Chen
"""
# 迷宫二维列表 n行m列 :[[0 for i in range(m)] for j in range(n)]
# 假设1 是空地,2 是障碍物
a = [[0 for i in range(100)] for j in range(100)]
# 标志是否访问, 0是未访问,1是已经访问
flag = [[0 for i in range(100)] for j in range(100)]
# 方向数组
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]

# 设最短路径长度
min_dis = 99999999


def dfs(x, y, step):
    if x == p and y == q:
        global min_dis
        if step < min_dis:
            min_dis = step
        # 回退
        return

    ‘‘‘顺时针试探‘‘‘
    for i in range(0, 3):
        tx = x + dx[i]
        ty = y + dy[i]
        if a[tx][ty] == 1 and flag[tx][ty] == 0:
            flag[tx][ty] = 1
            dfs(tx, ty, step + 1)
            flag[tx][ty] = 0

    return


if __name__ == ‘__main__‘:
    # 输入m行n列
    m, n = map(int, input().split())
    # 给地图赋值,空地、障碍物
    for i in range(0, m):
        temp = list(map(int, input().split()))
        for j in range(0, n):
            # a[i][j] = int(input())
            a[i][j] = temp[j]

    # 输入起点和终点坐标
    start_x, start_y = map(int, input().split())
    # global p, q
    p, q = map(int, input().split())

    # 从起点开始,所以起点设置为已经访问状态
    flag[start_x][start_y] = 1
    dfs(start_x, start_y, 0)

    print(min_dis)

‘‘‘
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
0 0
3 2
‘‘‘

5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
0 0
3 2
7

Process finished with exit code 0

深搜dfs求解迷宫问题

原文:https://www.cnblogs.com/jmchen/p/13771936.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!