寻找二维数组中最短路径的matlab实现

     这是一道比较有意思的题目,给定一个数字方阵,你只能向右或者向下走,让你寻找从左上角到右下角的一条路径,且让这条路径所经过的数字之和最小。

     我将以下面这个方阵为例讲解一些较为关键的算法思路。现在给你如下方阵,如何找出一条数字和最小的路径呢?

     最简单粗暴的方法就是把所有的路径找出来,计算每一条路径的值,然后进行比较,找出那条最短路径。但我们不需要这么做,毕竟设计一个遍历所有路径的算法还是挺复杂的。我们知道,最短路径的子路径也一定最短,从这一点出发便可以大大简化我们算法的设计-------我们只需要找出最短的一条子路径,然后沿着最短子路径再寻找其他最短子路径就可以了。

    我们可以从第一行开始,很显然,第一行每一条子路径都是最短的,因为只有一条路径,因此我们可以对每条路径进行求和(这里得提醒一下每条路径的起点都是数组的左上角)。同理,第一列也是如此。我们可以将每条路径的值存入一个新的数组中,终点对应的位置存放这条路径的值,如下图所示:

    接下来我们从第二行第二列的元素开始,为表示方便我们记为(2,2),(i,j)表示第i行第j列。由于起点是(1,1),我们只能向右或向下,因此能到达(2

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个使用Dijkstra算法求解最短路径MATLAB代码示例: ```matlab function [distances, path] = dijkstra(adjacency_matrix, start_node, end_node) num_nodes = size(adjacency_matrix, 1); distances = inf(1, num_nodes); visited = false(1, num_nodes); previous = zeros(1, num_nodes); distances(start_node) = 0; while sum(visited) < num_nodes current_node = find_min_distance(distances, visited); visited(current_node) = true; neighbors = find(adjacency_matrix(current_node, :)); for i = 1:length(neighbors) neighbor = neighbors(i); if ~visited(neighbor) new_distance = distances(current_node) + adjacency_matrix(current_node, neighbor); if new_distance < distances(neighbor) distances(neighbor) = new_distance; previous(neighbor) = current_node; end end end end path = generate_path(previous, start_node, end_node); end function node = find_min_distance(distances, visited) min_distance = inf; node = -1; for i = 1:length(distances) if ~visited(i) && distances(i) < min_distance min_distance = distances(i); node = i; end end end function path = generate_path(previous, start_node, end_node) if previous(end_node) == 0 path = []; return; end path = [end_node]; current_node = end_node; while current_node ~= start_node current_node = previous(current_node); path = [current_node, path]; end end ``` 这段代码使用邻接矩阵表示图的连接关系。输入参数`adjacency_matrix`是一个包含图连接关系的二维矩阵,`start_node`和`end_node`表示起点和终点节点的索引。函数返回最短路径的距离数组`distances`和路径数组`path`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值