Advertisement
Guest User

Programa que gear permutacoes de um vetor em C

a guest
Sep 26th, 2011
400
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.56 KB | None | 0 0
  1. /*
  2. * [permnorep2.c]
  3. * Gera permutacoes de tamanho n de um vetor
  4. * preenchido usando a entrada padrao.
  5. *
  6. * [Autor]
  7. * Marcos Paulo Ferreira (Daemonio)
  8. * undefinido gmail com
  9. * http://daemoniolabs.wordpress.com
  10.  *
  11.  *
  12.  * Seg Set 26 08:03:02 BRT 2011
  13.  */
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16.  
  17. /* Quantidade maxima de elementos. */
  18. #define MAX_E 30
  19. /* Tamanho maximo de cada elemento. */
  20. #define MAX_S 100
  21.  
  22. /* Funcao que retorna verdadeiro se
  23.  * `num' nao contem algarismos repetidos
  24.  * e zero caso contrario. */
  25. char eh_sem_repeticao(int *num, int r) {
  26.     int i, j ;
  27.  
  28.     for(i=0; i < r; i++) {
  29.         for(j=0; j < r && i != j; j++) {
  30.             if(num[i] == num[j]) {
  31.                 return 0;
  32.             }
  33.         }
  34.     }
  35.  
  36.     return 1 ;
  37. }
  38.  
  39.  
  40. int main(int argc, char **argv) {
  41.     /* vetor que representara cada permutacao. */
  42.     int *num ;
  43.     /* quantidade de elementos do vetor. */
  44.     int n ;
  45.     /* controle de loop. */
  46.     int i, j ;
  47.     /* Cria o vetor com MAX_E posicoes. */
  48.     char vetor[MAX_E][MAX_S] ;
  49.  
  50.     /* Entrar com os elementos. */
  51.     for(i=0; i < MAX_E; i++ ) {
  52.         printf("Digite o elemento %d (fim para terminar): ", i+1) ;
  53.         /* Leitura com scanf para facilitar.
  54.          * Aconselho usar fgets para propositos gerais. */
  55.         scanf("%s", &vetor[i]) ;
  56.         if ( ! strcmp(vetor[i], "fim") ) {
  57.             break ;
  58.         }
  59.     }
  60.  
  61.     /* Tamanho da entrada. */
  62.     n = i ;
  63.  
  64.     if ( n == 0 ) {
  65.         printf("n deve ser maior que zero.\n") ;
  66.         return -1 ;
  67.     }
  68.  
  69.     /* Aloca espaco para o vetor num. Lembre-se
  70.      * que o vetor `num' representa um numero
  71.      * na base n com n algarismos. */
  72.     num = (int *)calloc(n+1, sizeof(int)) ;
  73.     if ( num == NULL ) {
  74.         perror("malloc") ;
  75.         return -1;
  76.     }
  77.  
  78.     /* Inicio do algoritmo. */
  79.     while ( num[n] == 0 ) {
  80.         for(i=0; i < n; i++) {
  81.             /* Mostra a permutacao na tela se
  82.              * e somente se `num' nao contem
  83.              * algarismos repetidos. */
  84.             if ( eh_sem_repeticao(num, n) ) {
  85.                 for(j=0; j < n; j++) {
  86.                     printf("%s ", vetor[num[j]]) ;
  87.                 }
  88.                 putchar('\n') ;
  89.             }
  90.  
  91.             /* incrementa o algarismo menos
  92.              * significativo. */
  93.             num[0]++ ;
  94.         }
  95.  
  96.         /* distribui os vai-uns. */
  97.         for(i=0; i < n; i++) {
  98.             if(num[i] == n) {
  99.                 num[i] = 0;
  100.                 num[i+1]++ ;
  101.             }
  102.         }
  103.     }
  104.  
  105.     free(num) ;
  106.  
  107.     return 0;
  108. }
  109.  
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement