一道C++编程题目,求大神帮忙,有没有简单点的算法,求程序!!答得好可以加分~~~

菜鸟只能穷举,但是对于m*n的矩阵,将会循环m^n次!!TT
2024-11-30 07:49:06
推荐回答(2个)
回答1:

以上为运行结果,代码如下:

/*

思路如下:

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;


}

望及时采纳,花了一个多小时写的!

回答2:

动态规划.
事实上,你这个要求不并复杂,每列必取一个,只是取几的问题。
我们假定,前7个你都知道了,最后一个也就很好取了。
向前推定一个,因为最后一个已知,第6个也可以取到。

如果我们用n列上取x表示这个问题(n,x),原题是(8,8)和(8,10)
7列上只有(7,8-1)、(7,10-8), (7,10-1)
每向前一次,可能的子问题会更多,不过会有很多重复。