Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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


Mamma diceva sempre che stupido è chi lo stupido fa.
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 :)


"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
cit. theprogrammer
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