This is basically counting in base n-1 (where every digit is shifted by 1), try the following:
Edit: Used vector
instead of new[]
, delete[]
#include <vector>
void generatePerms(int n, int k)
{
vector<int> perms(k, 1);
//iterate through all permutations
bool done;
do {
//Do something with the current permutation, for example print it:
for (int i = 0; i < k-1; i++)
cout << perms[i] << ", ";
cout << perms[k-1] << endl;
/*
* Increment last digit first - if it's to big, reset to 1 and
* carry one (increment next digit), which may also carry one etc.
*
* If all digits caused a carry, then the permutation was n, n, ..., n,
* which means, that we can stop.
*/
done = true;
for (int i = k-1; i >= 0; i--) {
if (++perms[i] > n) {
perms[i] = 1;
continue;
} else {
done = false; //not all digits caused carry
break;
}
}
} while (!done);
}