三默网为您带来有关“2021-05-18”的文章内容,供您阅读参考。
2021-05-18
2023-01-21 17:18:05
一.问题描述
【问题描述】假设一个矩阵mat的大小为M行N列,矩阵每个位置上有大于或等于0的整数,现从左上角[1, 1]开始,每次只能向下或向右走一步,最后到达右下角[M, N],路径上的数字累加就是路径和。现要求最短路径和以及最短的路径。
【输入形式】在屏幕上输入矩阵大小,以及矩阵每个元素的值。
【输出形式】最短路径和,以及最短路径。
【样例1输入】
4 4
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
【样例1输出】
12
1 1
1 2
2 2
3 2
3 3
3 4
4 4
二.算法思路
三.代码
#include<bits/stdc++.h>
using namespace std;
int dp[20][20];
int rec[20][20];//记录数组
void SHORTESTPATH(int m,int n){
for(int i=2;i<=m;i++){//第一列只能由它上面的路径走来
dp[i][1]+=dp[i-1][1];
rec[i][1]=1;//从上往下走
}
for(int i=2;i<=n;i++){//第一行只能由它左面的路径走来
dp[1][i]+=dp[1][i-1];
rec[1][i]=2;//从左往右走
}
for(int i=2;i<=m;i++){
for(int j=2;j<=n;j++){
if(dp[i-1][j]+dp[i][j]<=dp[i][j-1]+dp[i][j]){
dp[i][j]+=dp[i-1][j];
rec[i][j]=1;
}
else{
dp[i][j]+=dp[i][j-1];
rec[i][j]=2;
}
}
}
}
void TRACEBACK(int i,int j){
if(i==1&&j==1){
cout<<1<<" "<<1<<endl;
return;
}
if(rec[i][j]==1){
TRACEBACK(i-1,j);
}
if(rec[i][j]==2){
TRACEBACK(i,j-1);
}
cout<<i<<" "<<j<<endl;
}
int main(){
int m,n;
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>dp[i][j];
}
}
SHORTESTPATH(m,n);
cout<<dp[m][n]<<endl;
TRACEBACK(m,n);
}
/*
4 4
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
*/