2010-09-21 3 views
1

Я пытаюсь написать функцию C, чтобы получить список всех перестановок множества чисел, в группах по пять, в том числе повторных номеров:Перестановка для чисел в C

15-11-49-43-5 
2-30-34-6-11 

Так что это достаточно легко написать функция, чтобы захватить все перестановки ряда набора и выбросить их, но отображается на определенный размер группы, я несколько застрял ..

+0

Можете ли вы уточнить, что вы имеете в виду под «отображением определенного размера группы»? –

+1

@Niki Yoshiuchi: я думаю, что он означает жестко закодированные циклы – Svisstack

+0

Я скорее имел в виду, если бы мне пришлось найти все перестановки от 1 до 49, которые находятся в группах по 5. –

ответ

1
void visit(int *Value, int N, int k) 
{ 
    static level = -1; 
    level = level+1; Value[k] = level; 

    if (level == N) 
    print(Value, N); 
    else 
    for (int i = 0; i < N; i++) 
     if (Value[i] == 0) 
     visit(Value, N, i); 

    level = level-1; Value[k] = 0; 
} 

для получения дополнительной информации вы можете посетить http://www.bearcave.com/random_hacks/permute.html

0

Я разделил бы это на две проблемы: а) найти все комбинации 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) как рекурсивный шаг, а затем просто распечатать массив в базовом футляре (или сделать что угодно).

0

Если вы знаете, как найти все перестановки, но не все комбинации размера 5, то просто найти все перестановки:

INT A [49] = {0, 0, ..., 0, 1, 1, 1, 1, 1};

Каждая перестановка массива A соответствует комбинации, содержащей число (i + 1), тогда и только тогда, когда A [i] == 1 для каждого i из [0, 49].

0

Поскольку повторение разрешено, а выходной набор меньше, чем установленный вход, на самом деле это не перестановка, на которой вы находитесь.

Вы просто ищете простой подсчет:

for (a[0] = 1; a[0] <= 49; a[0]++) 
    for (a[1] = 1; a[1] <= 49; a[1]++) 
    for (a[2] = 1; a[2] <= 49; a[2]++) 
     for (a[3] = 1; a[3] <= 49; a[3]++) 
     for (a[4] = 1; a[4] <= 49; a[4]++) 
      printf("%d-%d-%d-%d-%d\n", a[0], a[1], a[2], a[3], a[4]); 
1

Вы хотите получить определенную перестановку, как, например,

  • перестановкой 1 == 1, 1, 1, 1, 1
  • перестановка 2 == 1, 1, 1, 1, 2
  • перестановки 49 == 1, 1, 1, 1, 49
  • перестановка 50 == 1, 1, 1, 2, 1
  • перестановка 42000000 == 8, 14, 49, 35, 42

Преобразовать номер, который вы хотите (минус 1) базировать 49 и использовать "цифры" (плюс 1) для результата.

 
42000000 - 1 = 41999999 
41999999 = (7 * 49^4) + (13 * 49^3) + (48 * 49^2) + (34 * 49) + 41 
result  8   14   49   35   42 
Смежные вопросы