赞
踩
问题:给定一个包含正整数的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[][] 决策
- int MinPath(int a[3][3],int m,int n){
- int dist[m][n],path[m][n],i,j;//dist存最短路径长度,path存决策.1向下走.0向右走
- dist[0][0] = a[0][0];path[0][0] = 0;
- for(j=1;j<n;j++){//第0行
- dist[0][j] = dist[0][j-1]+a[0][j];
- path[0][j] = 1;
- }
- for(i=1;i<m;i++){//第0列
- dist[i][0] = dist[i-1][0] + a[i][0];
- path[i][0] = 0;
- }
- for(i=1;i<m;i++)
- for(j=1;j<n;j++)
- if(dist[i-1][j] > dist[i][j-1]){
- dist[i][j] = dist[i][j-1] + a[i][j];
- path[i][j] = 1;
- }
- else{
- dist[i][j] = dist[i-1][j] + a[i][j];
- path[i][j] = 0;
- }
- cout<<"回溯路径为:";
- for(i=m-1,j=n-1;i>0||j>0;){
- cout<<a[i][j]<<"<--";
- if(path[i][j] == 0) i--;
- else j--;
- }
- cout<<a[0][0]<<endl;
- return dist[m-1][n-1];
- }
测试如下:
- int main(){
- int a[3][3] = {1,3,1,1,5,1,4,2,1};
- int dist = MinPath(a,3,3);
- cout<<"从左上角到右下角的最短路径为:"<<dist<<endl;
- return 0;
- }
输出如下:
回溯路径为:1<--1<--1<--3<--1
从左上角到右下角的最短路径为:7
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。