Я разделил бы это на две проблемы: а) найти все комбинации nCk вашего массива размера n b) найти все перестановки массива длины k. Вы сказали, что вы уже знаете, как сделать перестановки, поэтому давайте сосредоточимся на комбинациях:
void combinations(int *arr, int *comb, int n, int k, int kCurr)
{
if(kCurr >= k)
{
permutations(comb, k);
return;
}
int i;
for(i=0; i<n; ++i)
{
comb[kCurr] = arr[i];
combinations(arr+i, comb, n-i, k, kCurr+1);
}
}
, которые назвали бы так:
int myArray[49] = {1, 2, ..., 49};
int myCombs[5];
combinations(myArray, myCombs, 49, 5, 0);
Это вычисляет все комбинации 49C5 путем создания массива myCombs
, и когда он заполнен, он вызывает функцию permutations
. Если permutations
реализовано правильно, вы распечатываете все перестановки всех комбинаций 49C5.
EDIT: Дух, вы можете просто сделать combinations(arr, comb, n, k kCurr+1)
как рекурсивный шаг, а затем просто распечатать массив в базовом футляре (или сделать что угодно).
Можете ли вы уточнить, что вы имеете в виду под «отображением определенного размера группы»? –
@Niki Yoshiuchi: я думаю, что он означает жестко закодированные циклы – Svisstack
Я скорее имел в виду, если бы мне пришлось найти все перестановки от 1 до 49, которые находятся в группах по 5. –