Oppure

Loading
24/10/09 11:09
Premoli
ciao a tutti!!!

ho scritto questo codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int charset[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
	int n;
	int k, i, j, new_line=0, exit;
	FILE *fp;

	fp=fopen("comb.txt", "w");

    printf("\nInserire il valore di k: ");
    scanf("%d", &k);

    int index[k];
    n=20;
    i=0;

	memset(index, 0, k * sizeof(int));

	for (;;)
	{
		exit = 1;
		for (i = 0; i < k; i ++)
		{
			fprintf(fp, "%d ", charset[index[i]]);
			printf("%d ", charset[index[i]]);

			if (index[i] < n - 1)
				exit = 0;
		}

        fprintf(fp, "%c", '\n');
        printf("\n");

		if (exit)
		{
			break;
		}

		++ index[k - 1];
		for (j = k - 1; j >= 1; j --)
		{
			if (index[j] >= n)
			{
				index[j] = 0;
				++ index[j - 1];
			}
		}
	}

    fclose(fp);
	return 0;
}


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. :)
aaa
24/10/09 11:37
ingMark
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
aaa
24/10/09 14:52
Lawliet
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 :)
aaa
27/10/09 15:27
Premoli
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 ;)
aaa