#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");
}
}
//主函数
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");
}
}