2013-05-27 2 views
0

Я пытаюсь сделать простую программу переадресации, которая с номеров ввода возвращает мне все перестановки других чисел.Перестановка 0..7 в C

Если я:

{0,1,2,3,4,5,6,7} 

И я поставил в качестве входного номера 3, я хочу, чтобы все перестановки каждого числа, кроме заданного числа. Я не забочусь о порядке списка, мне просто нужно, чтобы первый номер был номером ввода.

{3,0,1,2,4,5,6,7} 
{3,1,2,4,5,6,7,0} 
{3,2,4,5,6,7,0,1} 
... etc 

Я судимое this solution, что дает все перестановки, но начинать от 1, и я не знаю, как остановить его, когда я закончу с указанием перестановки «желательную первым номером», так как я не забочусь остальные. Было бы здорово обрабатывать выходы с индексами для другого материала, который я делаю. Есть идеи? Благодарю.

+1

Менее элегантным решением может быть удаление номера из массива, отображение перестановок всех остальных номеров и добавление этого числа ко всем этим решениям. – vish213

ответ

1

Выполнение этой программы с указанием номера входа в качестве аргумента.

#include <stdio.h> 

char a[] = {0,1,2,3,4,5,6,7}, x; 
#define SWAP(i, j) x = a[i], a[i] = a[j], a[j] = x 

void print() 
{ 
    int i; 
    char c = '{'; 
    for (i = 0; i < sizeof a; c = ',') printf("%c%d", c, a[i++]); 
    puts("}"); 
} 

void perm(int j) 
{ 
    int i = j-1, k; 
    if (i <= 0) { print(); return; } 

    perm(i); 
    for (; i; --i) 
    { 
     for (k = j; k > i; --k) 
      if (a[i] == a[k]) break; 
     if (k > i) continue; 

     SWAP(i, j); 
     perm(j-1); 
     SWAP(i, j); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    int i; 
    if (argc != 2) return 1; 

    i = atoi(argv[1]); 
    SWAP(i, 0); 
    perm(sizeof a - 1); 
    return 0; 
} 
+0

Ваш ответ выглядит великолепно, но, но у меня возникают проблемы с попыткой выполнить программу с номером ввода в качестве аргумента. Есть ли вероятность, что вы можете немного изменить код, чтобы я мог поместить основную функцию непосредственно в нужный номер? То, что я пробовал для этого, это поставить 'i = 5;' (например), но он не работает. Заранее спасибо! –

+1

Ну, конечно, вы можете изменить 'i = atoi (argv [1])' to 'i = 5'; возможно, вы просто забыли удалить строку 'if (argc! = 2) return 1;'. – Armali

+1

Большое вам спасибо! –

Смежные вопросы