c++ - All possible sums in an array and the projection of the combinations -
well, first of newbie c++ programming, second have problem solve seems give me headache. goes this. have char[3][14]
(user_in
in code) , input user fill it. user types '1','x','2','*'
. example:
1** 1*2 **2 *x* 1** 1** *x2 **2 **2 1x* 1** *x* **2 1** 1x2
then transform array int[3][14]
(user_in_tr
in code). every *
put 0
, 1
put 1
, x
put 2
, 2
put 3
. so:
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
the thing want count possible sums, taking 1 element each row. notice element must not 0. wherever there 0 skip it. in example be:
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
and on...
max sum = 42 (14x3), min sum = 14 (14x1)
also want show numbers added.
have came code results not ones expected here code:
#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; }
one way might consider solving problem using recursion. although not practice, recursion on problem improves readability (only 1 loop processing data).
#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, should read data user /*for (unsigned = 0; < 14; ++i) { row temp; (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 lazy, code bellow loads data // vector data. if had c++11 use // initializer lists. if want try code above, // comment out 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; } (row::const_iterator entry = begin->begin(); entry != begin->end(); ++entry) { calculate_sums(value + *entry, begin+1, end); } }
if want show numbers added, replace unsigned value
vector add numbers in each iteration, display sum , components. if chance add example above code.
edit: following piece of code output full sums (including both numbers , result). difference previous code storing combinations can display them latter, achieved passing std::vector
(a list) function calculate_sums
(previously passed on running total value). hope helps.
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 above } void calculate_sums(const row& values, data::const_iterator begin, data::const_iterator end) { if (begin == end) { int value = 0; (unsigned = 0; < values.size(); ++i) { value += values[i]; std::cout << values[i] << char((i < values.size()-1) ? '+' : '='); } std::cout << value << std::endl; return; } (row::const_iterator entry = begin->begin(); entry != begin->end(); ++entry) { row temp(values); temp.push_back(*entry); calculate_sums(temp, begin+1, end); } }
Comments
Post a Comment