牛客华为机试-迷宫问题

题目描述

定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:

int maze[5][5] = {

    0, 1, 0, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0

};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。
Input:
一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
Output:
左上角到右下角的最短路径,格式如样例所示。
Sample Input:
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output:
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

输入描述:
输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

输出描述:
左上角到右下角的最短路径,格式如样例所示。

思路

栈实现深度遍历

代码实现

dirs = [
    lambda x,y:(x+1,y),#下
    # lambda x,y:(x-1,y),#上
    # lambda x,y:(x,y-1),#左
    lambda x,y:(x,y+1)#右
#模拟上下左右
]

def solve_maze(x1,x2,y1,y2):
    stack = []                    #模拟栈
    stack.append((x1,y1))         #放入起始值
    maze[x1][y1] = '2'            #访问过标记为2
    while len(stack) > 0:         #循环访问
        cur_node = stack[-1]      #取栈中最后一个值
        if cur_node == (x2,y2):   #如果到了终点,输出栈中所有元素,并return
            for i in stack:
                print('(' + str(i[0]) + ',' + str(i[1]) + ')')
            return
        for d in dirs:                                             #依次向下向右遍历
            next_node = d(cur_node[0],cur_node[1])                 #取下一结点
            if n > next_node[0] >= 0 and m > next_node[1] >= 0:    #数组越界判断   
                if maze[next_node[0]][next_node[1]] == '0':        
                    #结点内是0则访问置为2,结点入栈
                    stack.append(next_node)
                    maze[next_node[0]][next_node[1]] = '2'
                    break
        else:       #否则退回到上一个访问成功的结点
            stack.pop()
while True:
    try:
        s = list(map(int,input().split()))
        #接收迷宫的维度n,m
        n = s[0]
        m = s[1]
        maze = []
        for i in range(n):
            #接收迷宫的数据
            maze .append(input().split())
        #maze = [[0 0 0 0 1]
                 [1 1 1 0 0]
                 [0 1 0 1 0]]
        #将数据处理成上述形式,用来深度遍历
        solve_maze(0,n-1,0,m-1)
        #调用函数
    except:
        break