Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - linguaggio c: disposizioni senza ripetizioni
Forum - C/C++ - linguaggio c: disposizioni senza ripetizioni

Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 13:09
Sabato, 24/10/2009
ciao a tutti!!!

ho scritto questo codice:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.         int charset[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
  8.         int n;
  9.         int k, i, j, new_line=0, exit;
  10.         FILE *fp;
  11.  
  12.         fp=fopen("comb.txt", "w");
  13.  
  14.     printf("\nInserire il valore di k: ");
  15.     scanf("%d", &k);
  16.  
  17.     int index[k];
  18.     n=20;
  19.     i=0;
  20.  
  21.         memset(index, 0, k * sizeof(int));
  22.  
  23.         for (;;)
  24.         {
  25.                 exit = 1;
  26.                 for (i = 0; i < k; i ++)
  27.                 {
  28.                         fprintf(fp, "%d ", charset[index[i]]);
  29.                         printf("%d ", charset[index[i]]);
  30.  
  31.                         if (index[i] < n - 1)
  32.                                 exit = 0;
  33.                 }
  34.  
  35.         fprintf(fp, "%c", '\n');
  36.         printf("\n");
  37.  
  38.                 if (exit)
  39.                 {
  40.                         break;
  41.                 }
  42.  
  43.                 ++ index[k - 1];
  44.                 for (j = k - 1; j >= 1; j --)
  45.                 {
  46.                         if (index[j] >= n)
  47.                         {
  48.                                 index[j] = 0;
  49.                                 ++ index[j - 1];
  50.                         }
  51.                 }
  52.         }
  53.  
  54.     fclose(fp);
  55.         return 0;
  56. }



che calcola tutte le disposizioni, funziona abbastanza bene, sicuramente si può fare di meglio, ma non è questo il punto, ora vorrei modificarlo per evitare che tra le combinazioni ci siano ripetizioni
ad esempio vorrei che la combinazione
1234 non fosse ripetuta due volte
e che combinazioni del tipo
1111 non venissero considerate
ma non ho niente in mente, voi avete qualche idea?
spero di essere stato chiaro, e in attesa di una vostra risposta vi ringrazio anticipatamente. :)

PM Quote
Avatar
ingMark (Ex-Member)
Pro


Messaggi: 176
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 13:37
Sabato, 24/10/2009
la recursione :k:

ad ogni chiamata metti un nuovo numero nel vettore.
Inoltre tenendo un vettore dove marchi gli elementi già inseriti non avrai ripetizioni

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 16:52
Sabato, 24/10/2009
Ma che stai calcolando le combinazioni per win for live!? xD
Comunque una idea potrebbe anche essere che inserisci un altro vettore.Come detto da ingMark. Li inserisci di in vola in volta... controllando che il numero attuale uscito non sia presente nel vettore. Oppure fare un vettore "booleano", dove ogni numero uscito corrisponde all'indice del vettore cambiando il valore per indicare che è già presente :)

PM Quote
Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 16:27
Martedì, 27/10/2009
scusate se rispondo solo ora, ma in questi giorni non mi è stato possibile collegarmi.
mi sembrano buone idee, che dire, grazie a tutti e due ;)

PM Quote