以上为运行结果,代码如下:
/*
思路如下:
1.对于第八列,和计算完成后,不管找没找到值,寻找当前列下一行(即i+1),无需进入下一列;
2.对于非第八列,有两种情况:
a.和大于等于最大值10(如果矩阵中有零值存在,此处应为大于10),不满足路径条件,没必要进入下一列计算,进入当前列下一行进行计算(即i+1);
b.满足条件,则进入下一列寻找(即PathIndex()).
3.直到每一列的五行对应的各个下级路径均寻找完成,返回上一列。
注:continue为返回进入当前列下一行,return为返回上一列,运行PathIndex()为进入下一列。
*/
void PathIndex(int sum,const int a[][5],int*b,int j)
{
int oldsum = sum; //保存初始值,每次新的循环进行初始化
int oldj = j;
for(int i = 1;i<=5;i++)
{
sum = oldsum; //赋值初始化
j = oldj;
sum += a[j-1][i-1]; //求和
b[j - 1] = i; //保存位置
if(j == 8)
{
if((sum == 8)||(sum == 10)) //找到最后一列并得到了对应的和
{
//打印路径
for(int jindex = 0;jindex < 8;jindex ++)
{
printf("(i=%d j=%d) ",b[jindex],jindex+1);
}
printf("\n");
//打印对应位置的值相加
for(int index = 0;index < 8;index ++)
{
if(index == 7)
{
printf("%d",a[index][b[index] - 1]);
}
else
{
printf("%d+ ",a[index][b[index] - 1]);
}
}
printf("\n");
}
continue ; //继续寻找下一行
}
else
{
if(sum >= 10) //超出8或10 计算下一行
{
continue;
}
else
{
PathIndex(sum,a,b,++j); //进入下一列进行计算
}
}
}
return ; //五行计算完成,未找到值,返回,
}
int main()
{
int a[8][5] = {
{3,2,1,4,15},
{7,2,1,4,20},
{23,3,1,33,14},
{21,1,9,2,30},
{22,5,26,1,4},
{7,12,1,5,9},
{12,6,6,3,1},
{8,12,1,56,32}};
int a1[8]={0}; //保存得到的路径位置。
int sum = 0;
int j = 1;
PathIndex(sum,a,a1,j);
return 0;
}
望及时采纳,花了一个多小时写的!
动态规划.
事实上,你这个要求不并复杂,每列必取一个,只是取几的问题。
我们假定,前7个你都知道了,最后一个也就很好取了。
向前推定一个,因为最后一个已知,第6个也可以取到。
如果我们用n列上取x表示这个问题(n,x),原题是(8,8)和(8,10)
7列上只有(7,8-1)、(7,10-8), (7,10-1)
每向前一次,可能的子问题会更多,不过会有很多重复。