问题描述:
这是CSDN上每日一练的题目,随机生成一个二维矩阵,从左上角走到右下角,只考虑向右和向下无其他方向,求和最短的路径。
官方的答案大家纷纷吐槽很狗血,我按照自己的理解写了一个。
支持行列数相同的和行列数不同的矩阵,遇到相同值优先右行(后续继续进行优化)。
"""
作者:魚香肉丝盖饭
日期:2022年04月10日
"""
import numpy as np
size = (10, 10) # 定义矩阵大小
matrixmap = np.random.randint(1, 10, size=size) # 随机生成矩阵
row = len(matrixmap) - 1 # 矩阵行数(高度)
col = len(matrixmap[0]) - 1 # 矩阵列数
print(matrixmap)
point = [] # 最小路径点空列表
path = [] # 路径方向空列表
steprow = 0 # 初始化纵向步长
stepcol = 0 # 初始化横向步长
step = 0 # 初始化总步长
while step <= row + col: # 依次只走一步,只能横/纵走,所以走到终点的步数是固定的
P = matrixmap[steprow, stepcol] # 每一步走完之后的当前值,首次执行到此行时为初始化矩阵左上角的值。
if steprow < row and stepcol < col: # 当没走到矩阵边缘行/列时
PS = matrixmap[steprow + 1, stepcol] # 当前值下侧的值
PE = matrixmap[steprow, stepcol + 1] # 当前值右侧的值
if PS < PE: # 下侧值小于右侧值
steprow += 1 # 更新取值索引
path.append('下') # 装填路径方向
elif PE <= PS: # 右侧值小于下侧值
stepcol += 1 # 更新取值索引
path.append('右')
elif stepcol == col and steprow < row: # 到达矩阵列边缘后,直行到矩阵右下角
steprow += 1
path.append('下')
elif steprow == row and stepcol < col: # 到达矩阵行边缘后,直行到右下角
stepcol += 1
path.append('右')
point.append(P) # 装填路径值
step += 1 # 更新总步长标志位
print(path)
print(point, sum(point))
[[5 9 3 7 1 2 4 9 5 1]
[3 7 5 7 2 1 1 2 3 4]
[3 6 5 9 8 7 8 6 7 8]
[5 3 4 5 3 5 9 2 5 4]
[1 9 5 5 3 6 5 8 7 2]
[4 2 6 9 8 1 3 1 2 7]
[8 4 7 6 3 8 3 3 8 4]
[2 7 8 4 3 1 6 7 9 4]
[2 1 6 5 8 3 3 8 9 9]
[2 2 8 5 9 3 1 6 8 2]]
['下', '下', '下', '下', '下', '右', '下', '右', '右', '右', '下', '右', '下', '右', '下', '右', '右', '右']
[5, 3, 3, 5, 1, 4, 2, 4, 7, 6, 3, 3, 1, 3, 3, 1, 6, 8, 2] 70