当前位置:   article > 正文

网格上的最短路径 动态规划法(C++实现)_网格最短路径算法

网格最短路径算法

问题:给定一个包含正整数的m x n网格,每次只能向下或向右移动一步,定义路径长度是路径上经过的整数之和。请找出一条从左上角到右下角的路径,使得路径长度最小。

算法:例如想到达(1,2)第2行第3列位置,只有两个方法1.从(1,1)向右一步。2.从(0,2)向下一步,根据(1,1)和(0,2)哪个最短路径短,即可知道该选择哪条。例如从左上角(0,0)到(1,1)的最短路径为5,从左上角(0,0)到(0,2)的最短路径为3。3<5,所以选择从(0,2)向下一步到达(1,2)。此时(1,2)的最短路径,即从(0,0)-->(1,2)的最短路径 = (0,2)的最短路径 + (1,2)的坐标值。

代码如下:

dist[][] 最短路径长度,path[][] 决策

  1. int MinPath(int a[3][3],int m,int n){
  2. int dist[m][n],path[m][n],i,j;//dist存最短路径长度,path存决策.1向下走.0向右走
  3. dist[0][0] = a[0][0];path[0][0] = 0;
  4. for(j=1;j<n;j++){//第0行
  5. dist[0][j] = dist[0][j-1]+a[0][j];
  6. path[0][j] = 1;
  7. }
  8. for(i=1;i<m;i++){//第0列
  9. dist[i][0] = dist[i-1][0] + a[i][0];
  10. path[i][0] = 0;
  11. }
  12. for(i=1;i<m;i++)
  13. for(j=1;j<n;j++)
  14. if(dist[i-1][j] > dist[i][j-1]){
  15. dist[i][j] = dist[i][j-1] + a[i][j];
  16. path[i][j] = 1;
  17. }
  18. else{
  19. dist[i][j] = dist[i-1][j] + a[i][j];
  20. path[i][j] = 0;
  21. }
  22. cout<<"回溯路径为:";
  23. for(i=m-1,j=n-1;i>0||j>0;){
  24. cout<<a[i][j]<<"<--";
  25. if(path[i][j] == 0) i--;
  26. else j--;
  27. }
  28. cout<<a[0][0]<<endl;
  29. return dist[m-1][n-1];
  30. }

测试如下:

  1. int main(){
  2. int a[3][3] = {1,3,1,1,5,1,4,2,1};
  3. int dist = MinPath(a,3,3);
  4. cout<<"从左上角到右下角的最短路径为:"<<dist<<endl;
  5. return 0;
  6. }

输出如下:

回溯路径为:1<--1<--1<--3<--1
从左上角到右下角的最短路径为:7

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/831202
推荐阅读
相关标签
  

闽ICP备14008679号