牛客华为机试-迷宫问题
题目描述
定义一个二维数组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