矩阵地图求最小和最短用时最短路径

leetcode刷题,碰到了这样一道阿里实习笔试题,记录一下我的解题思路

题目介绍

大概意思就是给定一个mXn的矩阵,矩阵里面都是非负整数,那么现在要从蓝色区域出发(矩阵上边的矩阵外的区域),要到达红色区域,请问这个过程中的路径和最小是多少?
你可以从第一行任意一个起点出发,行走的时候可以 往下走,往左走,往右走。求最小的路径和。
(忘了加个条件,矩阵里都是非负数)需要遍历,
在这里插入图片描述

我的解答

纪录每一次遍历得到的和,之后的遍历,如果超过了之前的和,就跳出,如果小于,就重新记录。很快就可以得出结论了。实际写了一下,发现还是获取所有的路线比较难,遍历反而很简单。这是我的代码:

import sys
import time

sys.setrecursionlimit(9000000)  # 这里设置大一些


def list_list_get_min(list_0):
    end_list = get_step_list(list_0)
    print(end_list)
    sum_result = 0
    for func_x in end_list:
        sum_x = 0
        for index in func_x:
            sum_x += list_0[index[1]][index[0]]
        if sum_result == 0:
            print(func_x)
            print(sum_x)
            sum_result = sum_x
        if sum_x < sum_result:
            print(func_x)
            print(sum_x)
            sum_result = sum_x
    print(sum_result)
    return 0


def get_step_list(list_0, going_list=[], end_list=[]):
    # time.sleep(1)
    print('-'*30)
    print(going_list, end_list)
    if not list_0:
        return []
    # 如果还没开始
    if not going_list and not end_list:
        # 获取所有的起点坐标
        for i in range(len(list_0[0])):
            going_list.append([(i, 0)])
        return get_step_list(list_0, going_list, end_list)

    # 都走完了,返回结果
    if not going_list:
        return end_list

    # 如果已经开始,则递归获取所有的策略
    x0, y0 = going_list[0][-1]
    # 已经走完的,放进end_list
    if y0 == len(list_0) - 1:
        end_list.append(going_list[0])
        going_list = going_list[1::]
        return get_step_list(list_0, going_list, end_list)

    # 没走完的,获取下一步
    next_step = get_next_index(list_0, x0, y0)
    next_step = [i for i in next_step if i not in going_list[0]]
    # 把新生成的策略放进去
    for step in next_step:
        going_list.append([*going_list[0], step])
    # 上一步策略取出来
    going_list = going_list[1::]
    # 继续递归
    return get_step_list(list_0, going_list, end_list)


def get_next_index(list_0, x0, y0):
    next_step = []

    # 第一步只能前进
    if y0 == 0 and len(list_0) > 1:
        return [(x0, y0 + 1)]

    if x0 > 0:
        next_step.append((x0 - 1, y0))
        pass
    if x0 + 1 < len(list_0[0]):
        next_step.append((x0 + 1, y0))
    next_step.append((x0, y0 + 1))
    return next_step


a = [
    [7, 5, 1, 3],
    [1, 1, 1, 9],
    [1, 10, 3, 7],
    [1, 1, 1, 4],
    [2, 100, 1, 4]
]
# a = [
#     [10,2,1],
#     [10,2,100],
#     [1,2,1]
# ]
# next_step_list = get_next_index(a, 1, 2)
# print(next_step_list)
aaa = list_list_get_min(a)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值