已知n行数据,自上而下为第1行,第2行.....第n行。第i行数据有i个,求从第1行至第n行的最短路径及路径长度。

#include <stdio.h>
//主函数
void main(){
int a[50][50];//存储数据的数组
int value[50][50];//存储计算后的值
int sataus[50][50];//存储分支的值
int min;//存储最后一行中的最小值,用于排序
int i,j,b,value1,value2,ii,jj;
//输入数据
printf("要输入多少行数据?\n");
scanf("%d",&b);
for(i=0;i<b;i++){
printf("请输入第%d行数据\n",i);
for(j=0;j<=i;j++){
scanf("%d",&a[i][j]);
}  
}


//将数据相加放入新树组value
value[0][0]=a[0][0];//源点相等
sataus[0][0]=0;
for(i=1;i<b;i++)
for(j=0;j<=i;j++){
if(j==0){
      value[i][j]=value[i-1][j]+a[i][j];//第1列的数灯于value中同列上一行的数加上a中该行该列的数
sataus[i][j]=1;
}
else if(j==i){
                value[i][j]=value[i-1][j-1]+a[i][j];//三角形斜边上的点
sataus[i][j]=2;
}
else{
value1=value[i-1][j-1]+a[i][j];
value2=value[i-1][j]+a[i][j];
if(value1<value2){
value[i][j]=value1;
sataus[i][j]=2;
}
else {
value[i][j]=value2;
sataus[i][j]=1;
}


}
                
}


//找出最短路径
       min=value[b-1][0];
   ii=b-1;
   jj=0;
   for(j=1;j<b;j++)//找出最后一行的最小值
   if(min>value[b-1][j]){
               min=value[b-1][j];
   jj=j;
   }
for(i=b-1;i>=0;i--){
if(sataus[ii][jj]==1){
               sataus[ii][jj]=0;
   ii=i-1;
   jj=jj;
   
}
else if(sataus[ii][jj]==2){
               sataus[ii][jj]=0;
   ii=i-1;
   jj=jj-1;
   
}
           }


//输出
for(i=0;i<b;i++){
for(j=0;j<=i;j++){
printf("%d",sataus[i][j]);
printf("\t");
}
printf("\n");
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值