网格上的最短路径 动态规划法(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[][] 决策

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

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值