Re: Need help, loops...
Victor Bazarov wrote:
Fei Liu wrote:
I am trying to write a program to count dices. The program takes a
single integer 'n' (number of dice), it then outputs between 'n' and
'6*n', what combinations of the n dice result sums to it. Say, n=4,
sum=5, then it outputs 1 1 1 2 5, 1 1 2 1 5, 1 2 1 1 5, 2 1 1 1 5. I
am stuck with a problem, since my program is supposed to accept
arbitrary number of dice, I can't come up with a way to code the
loops. Remember it needs to iterate through arbitrary number of dices.
Here is what I have (compilies/runs/result is wrong for obvious reasons)
I think this is commonly solved using recursion.
V
Good idea, I have a working prototype, it's slow (exponential) but
produces correct answer.
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <iterator>
using namespace std;
typedef vector<unsigned int>::iterator dice_iterator;
typedef vector<unsigned int>::reverse_iterator dice_reverse_iterator;
void add_and_carry(dice_reverse_iterator iter, int position){
(*iter)++;
if(*iter == 7 && position != 0){
add_and_carry(iter+1, position-1);
*iter = 1;
}
}
int main(void){
unsigned int n, i,k;
while(cin){
cin >> n;
string line;
getline(cin, line);
unsigned int min=n, max=n*6, sum=0;
vector<unsigned int> dice(n);
dice_iterator iter = dice.begin();
for(i = min; i <= max; i++){
for(; iter != dice.end(); iter ++)
*iter = (i-1)/n+1;
iter = dice.begin();
do{
sum = accumulate(dice.begin(), dice.end(), 0);
if(sum == i) {
copy(dice.begin(), dice.end(),
ostream_iterator<unsigned int>(cout, " "));
cout << i << ' ' << endl;
}
add_and_carry(dice.rbegin(), n-1);
} while(*iter != 7);
}
}
return 0;
}