数组中所有可能的总和以及组合的投影

时间:2013-09-04 12:55:17

标签: c++ sum combinations

好吧,首先我是C ++编程的新手,其次我有一个问题要解决,这似乎让我头疼。它是这样的。我的代码中有char[3][14]user_in),我从用户那里获得输入以填充它。用户仅键入'1','x','2','*'。例如:

1**
1*2
**2
*x*
1**
1**
*x2
**2
**2
1x*
1**
*x*
**2
1**
1x2

然后我将此数组转换为另一个int[3][14](我的代码中为user_in_tr)。对于我* 0 1,我1 x 2 2 3 1** 100 1*2 103 **2 003 *x* 020 1** 100 1** 100 *x2 023 **2 003 **2 003 1x* 120 1** 100 *x* 020 **2 003 1** 100 1x2 123 First: 1+1+3+2+1+1+2+3+3+1+1+2+3+1+1=26 Second: 1+1+3+2+1+1+2+3+3+1+1+2+3+1+2=27 Third: 1+1+3+2+1+1+2+3+3+1+1+2+3+1+3=28 Fourth: 1+1+3+2+1+1+2+3+3+2+1+2+3+1+1=27 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace System; using namespace std; int main(array<System::String ^> ^args) { char user_in[3][14]; int user_in_tr[3][14] int i,j; int count0,count1,count2,count3,count4,count5,count6,count7,count8,count9,count10,count11,count12,count13; int sum; for(i=0;i<14;i++) { for(j=0;j<3;j++) { scanf("%c",user_in[j][i]); } } for(i=0;i<14;i++) { for(j=0;j<3;j++) { if(user_in[j][i]=='*') { user_in_tr[j][i]=0; } else if(user_in[j][i]=='1') { user_in_tr[j][i]=1; } else if(user_in[j][i]=='x') { user_in_tr[j][i]=2; } else { user_in_tr[j][i]=3; } } } for(count0=0;count0<3;count0++) { for(count1=0;count1<3;count1++) { for(count2=0;count2<3;count2++) { for(count3=0;count3<3;count3++) { for(count4=0;count4<3;count4++) { for(count5=0;count5<3;count5++) { for(count6=0;count6<3;count6++) { for(count7=0;count7<3;count7++) { for(count8=0;count8<3;count8++) { for(count9=0;count9<3;count9++) { for(count10=0;count10<3;count10++) { for(count11=0;count11<3;count11++) { for(count12=0;count12<3;count12++) { for(count13=0;count13<3;count13++) { sum=0; if(user_in[count0][0]!=0&&user_in[count1][1]!=0&&user_in[count2][2]!=0&&user_in[count3][3]!=0&&user_in[count4][4]!=0&&user_in[count5][5]!=0&&user_in[count6][6]!=0&&user_in[count7][7]!=0&&user_in[count8][8]!=0&&user_in[count9][9]!=0&&user_in[count10][10]!=0&&user_in[count11][11]!=0,user_in[count12][12]!=0&&user_in[count13][13]!=0) { sum=user_in[count0][0]+user_in[count1][1]+user_in[count2][2]+user_in[count3][3]+user_in[count4][4]+user_in[count5][5]+user_in[count6][6]+user_in[count7][7]+user_in[count8][8]+user_in[count9][9]+user_in[count10][10]+user_in[count11][11]+user_in[count12][12]+user_in[count13][13]; printf("%d",sum); printf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d",user_in[count0][0],user_in[count1][1],user_in[count2][2],user_in[count3][3],user_in[count4][4],user_in[count5][5],user_in[count6][6],user_in[count7][7],user_in[count8][8],user_in[count9][9],user_in[count10][10],user_in[count11][11],user_in[count12][12],user_in[count13][13]+"\n"); } } } } } } } } } } } } } } } system("PAUSE"); return 0; } 。所以:

{{1}}

我想要做的是计算所有可能的总和,从每一行中取一个元素。请注意,元素不能为0.因此,只要有0,我们就跳过它。在我的例子中,它将是:

{{1}}

等等......

最大总和= 42(14x3),最小总和= 14(14x1)

另外,我想显示添加的数字 我想出了一些代码,但结果不是我预期的那些是我的代码:

{{1}}

1 个答案:

答案 0 :(得分:0)

您可以考虑解决问题的一种方法是使用递归。虽然并不总是很好的做法,但是对这个问题的递归显着提高了可读性(处理数据的循环只有1个)。

#include <iostream>
#include <vector>

typedef std::vector<unsigned> Row;
typedef std::vector<Row> Data;

void load_user_data(Data& data);
void calculate_sums(unsigned value, Data::const_iterator begin,
        Data::const_iterator end);

int main(int argc, char** argv)
{
    Data data;

    load_user_data(data);

    calculate_sums(0, data.begin(), data.end());

    return 0;
}

void load_user_data(Data& data)
{
    // WARNING: Untested, but should read data from user
    /*for (unsigned i = 0; i < 14; ++i)
    {
        Row temp;
        for (unsigned j = 0; j < 3; ++j)
        {
            char input = '\0';

            while (input == '\0')
            {
                std::cin >> input;
                switch (input)
                {
                case '1':
                    temp.push_back(1);
                    break;
                case 'x':
                    temp.push_back(2);
                    break;
                case '2':
                    temp.push_back(3);
                    break;
                case '*':
                    break;
                default:
                    input = '\0';
                }
            }
        }

        data.push_back(temp);
    }*/

    // Because I'm slightly lazy, the code bellow loads your data
    // into the vector Data.  If you had C++11 you could use
    // initializer lists.  If you want to try the code above,
    // comment out the code bellow.

    Row t;

    t.clear(); t.push_back(1); data.push_back(t);
    t.clear(); t.push_back(1); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(2); data.push_back(t);
    t.clear(); t.push_back(1); data.push_back(t);
    t.clear(); t.push_back(1); data.push_back(t);
    t.clear(); t.push_back(2); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(1); t.push_back(2); data.push_back(t);
    t.clear(); t.push_back(1); data.push_back(t);
    t.clear(); t.push_back(2); data.push_back(t);
    t.clear(); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(1); data.push_back(t);

    t.clear(); t.push_back(1); t.push_back(2); t.push_back(3);
    data.push_back(t);
}

void calculate_sums(unsigned value, Data::const_iterator begin,
        Data::const_iterator end)
{
    if (begin == end)
    {
        std::cout << value << std::endl;
        return;
    }

    for (Row::const_iterator entry = begin->begin();
            entry != begin->end(); ++entry)
    {
        calculate_sums(value + *entry, begin+1, end);
    }
}

如果要显示添加的数字,可以在每次迭代中将unsigned value替换为添加数字的向量,然后可以显示总和和组件。如果我有机会,我会在上面的代码中添加一个例子。

编辑:以下代码将输出完整的总和(包括数字和结果)。与前面代码的唯一区别是,您现在存储组合以便以后显示它们,这可以通过将std::vector(列表)传递给函数calculate_sums来实现(之前我们只有传递了总的运行总值)。希望这会有所帮助。

void calculate_sums(const Row& values, Data::const_iterator begin,
        Data::const_iterator end);

int main(int argc, char** argv)
{
    Data data;

    load_user_data(data);

    Row temp;
    calculate_sums(temp, data.begin(), data.end());

    return 0;
}

void load_user_data(Data& data)
{
    // Same as above
}

void calculate_sums(const Row& values, Data::const_iterator begin,
        Data::const_iterator end)
{
    if (begin == end)
    {
        int value = 0;
        for (unsigned i = 0; i < values.size(); ++i)
        {
            value += values[i];
            std::cout << values[i] << char((i < values.size()-1) ? '+' : '=');
        }
        std::cout << value << std::endl;
        return;
    }

    for (Row::const_iterator entry = begin->begin();
            entry != begin->end(); ++entry)
    {
        Row temp(values);
        temp.push_back(*entry);
        calculate_sums(temp, begin+1, end);
    }
}