2013-05-27 3 views
0

J'essaie de faire un simple programme de perméation qui, à partir d'un nombre d'entrée me renvoie toutes les permutations des autres nombres.Permutation de 0..7 en C

Si j'ai:

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

Et je mets comme numéro d'entrée 3, je veux avoir toutes les permutations de chaque numéro, sauf le nombre donné. Je ne m'inquiète pas de l'ordre de la liste, je me soucie juste du premier nombre est le nombre d'entrée.

{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 

J'ai tryed this solution, qui donne toute la permutation, mais il commence son de 1 et je ne sais pas comment l'arrêter quand je finis montrant les permutations du « premier numéro désiré », comme je ne me inquiète pas les autres. Ce serait aussi génial de gérer les sorties avec des index pour d'autres choses que je fais. Des idées? Merci.

+1

Une solution moins élégante peut être d'enlever le nombre du tableau, montrer les permutations de tous les autres nombres et ajouter ce nombre à toutes ces solutions. – vish213

Répondre

1

Exécutez ce programme avec votre numéro d'entrée comme argument.

#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

Votre réponse est belle mais, mais j'ai des problèmes pour essayer d'exécuter le programme avec un nombre d'entrée comme argument. Est-il possible que vous puissiez changer le code un peu afin que je puisse mettre directement dans la fonction principale le numéro désiré? La chose que j'ai essayée pour ceci est de mettre 'i = 5;' (par exemple) mais ça ne marche pas. Merci d'avance! –

+1

Eh bien, vous pouvez sûrement changer 'i = atoi (argv [1])' en 'i = 5'; peut-être avez-vous simplement oublié de supprimer la ligne 'if (argc! = 2) return 1;'. – Armali

+1

Merci beaucoup! –