华为OJ机试-迷宫问题
机试链接
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132…anking&tab=answerKey
之前学习过python,时间有点久了,平时工作也没怎么接触代码,想把一块重新捡起来,就找题目做做,发现真的很多都不会,于是找了很多解法方案,但是python的解法还是这个老哥的nice:
附上原先的:
本文链接:https://blog.csdn.net/weixin_26850469/article/details/112446815
连接 链接: link.
下面展示
代码
。简单明了!
# 利用动态规划和递归解
def jud(x, y, l, ll, lll): # 求x,y点坐标在迷宫里的可能走法,即向上,向下,向左,向右
n, m = len(l) - 1, len(l[0]) - 1 # l为迷宫位置二维图,ll为迷宫的每点从起点到该点
k = [] # 的最短路径,lll为记录正在探索的从起点到该点的路线用以避免走重复
if x + 1 <= n and (x + 1,y) not in lll and l[x + 1][y] != 1:#向右边走,不会超过边界,且不再已经走过的路线中,且不是墙体
k += [(x + 1,y)]#将这个点位,记录到路径里面
if x - 1 >= 0 and (x - 1,y) not in lll and l[x - 1][y] != 1:#向左走,不会超过边界,且不再已经走过的路线中,且不是墙体
k += [(x - 1,y)]
if y + 1 <= m and (x,y + 1) not in lll and l[x][y + 1] != 1:#向下走,不会超过边界,且不再已经走过的路线中,且不是墙体
k += [(x,y + 1)]
if y - 1 >= 0 and (x,y - 1) not in lll and l[x][y - 1] != 1:#向上走,不会超过边界,且不再已经走过的路线中,且不是墙体
k += [(x,y - 1)]
return k
def mg(x, y, l, ll, lll): # x,y为该点坐标,其余同上,探索x,y的走法
k = jud(x, y, l, ll, lll) # k为可能的走法
lll += [(x,y)] # lll位置储存
if len(k) > 0: # 是否为可走
for v in k:
x1,y1 = v
if not ll[x1][y1]: # 如果x1,y1位置 还没有路径信息,用x,y位置进
ll[x1][y1] = ll[x][y] + [(x1,y1)] # 行更新
if len(ll[x1][y1]) >= len(ll[x][y]) + 1: # 如果x1,y1之前储存的路径#要长于从x,y的路径到x1,y1的,则更新x1,y1路径信息
ll[x1][y1] = ll[x][y] + [(x1,y1)]
mg(x1, y1, l, ll, lll) # 再对x1,y1 这点进行探索
return False
while True:
try:
lists = input('')#获取输入的行数与列数
n = int(lists.split(" ")[0])
m = int(lists.split(" ")[1])
l, ll, lll = [], [], []
for i in range(n):
l += [list(map(int, input().split()))]
for i in range(n):
ll.append([])
for j in range(m):
ll[i].append([])
ll[0][0] = [(0,0)]
mg(0, 0, l, ll, lll) # 设置起始点为(0,0),你也可以设为其他点为起始,
for v in ll[-1][-1]: # 来探索其他点到任意一点的最短位置
print("(%d,%d)" % (v[0], v[1])) # ll[-1][-1], 指的是将右下角一点设,元组输出前面有空格,需要将格式转换为题目要求的格式
except:
break