Importante Permutazioni!

di il
1 risposte

Importante Permutazioni!

Salve ragazzi...sarò breve...per molti di voi sarà fin troppo semplice risolvere questo problema...ma io ho trovato molte ma molte difficoltà....il mio problema è....nel fare questo programma.......che dato un array di caratteri di dimensione non stabilita, ma una dimensione n qualsiasi...devo trovare tutte le permutazioni di quell'array che chiamo A e stamparle nel senso che le voglio vedere in output e sapere il loro effettivo numero...se qualcuno mi potrebbe aiutare nello scrivere il codice....quantomeno per comprenderlo il più possibile....e darmi una semplice spiegazione di come ha fatto a risolverlo.....vi ringrazioooo!...c sto perdendo la testa da 2 settimane!:(..il mio problema principale è nello sviluppare le permutazioni...e quindi creare....x ex nel caso l'array è composto da un solo elemento la permutazione è l'array stesso...nel caso ci sono 2 elementi le permutazioni sn 2 e sono l'array stesso e gli elementi invertiti...ed in generale..al crescere degli elementi le permutazioni sn il fattoriale del numero degli elemnti dell'array......ma nel caso ho più di 1 elemento cm faccio????...sn in difficoltà!

1 Risposte

  • Re: Importante Permutazioni!

    Ciao...questo è un codice tradotto da me (barbaramente) per fare le permutazioni di numeri( che potresti usare come etichette...). La funzione usa come inputs puntatori questo perchè lo usi all'interno di un altro programma statistico. Tu puoi aggiustare il tutto alle tue esigenze se non ti piace la versione con argomenti "puntatori"...
    Ecco il codice
    
    void permute(double *vec, int *n, int *p, int *ip, int *seqn, int *d, int *m, double *res)
    {
    
    	/*
    		vec=vettore da permutare. In testa al vettore metti uno 0
    		n=lunghezza del vettore (senza contare lo 0)
    		p=concatena n+1,1:n,n+1 (metti questa sequenza di numeri in un unico vettore). In testa al vettore metti uno 0
    		ip e seqn= vettore (di dimensione n+1) di interi da 1 a n. In testa al vettore metti lo 0
    		d=vettore (dimensione n+1) in cui al primo posto metti 0 e i restanti elementi uguali a -1. Anche in questo vettore metti in testa uno 0
    		m=n+1
    		res=risultato(lunghezza n*n!). Troverai tutte le permutazioni del vettore (da 1 a n la prima permutazione, da n+1 a 2n la seconda permutazione e così via)
    	
    		Per esempio se vec[3]={1,2} allora
    			- n=2
    			- p[5]={0,3,1,2,3}  		
    			- ip[3]={0,1,2}
    			- d[3]={0,0,-1}
    			- m=3
    			- 
    	*/
    	int i, ite=0, index0[*n+1], chk[*n+1], count=0, index1, index2, tmp, index20, index30[*n+1], j=1;
    
    	do{
    		for(i=1 ; i<=*n ; i++)
    		  {
    			res[ite**n+i-1] = vec[p[i+1]];
    			index0[i] = ip[i]+d[i]+1; 
    		  }
    
    		   ite += 1;
    		   *m = *n;
    
    		for(i=1 ; i<=*n ; i++)
    		  {
    			if( p[index0[i]]>seqn[i] ){ chk[i] = 0; }else{ chk[i] = 1; count +=1;}
    		  }
    
    		double *p_max, ini_p_max[count+1];
    		for(i=1 ; i<=*n ; i++){ if( chk[i]==1 ) {ini_p_max[j] = (double) seqn[i]; j+=1;} }
    		j=1;
    
    		p_max=&ini_p_max[1];
    
    		int *dim, ini_dim;
    		dim=&ini_dim;
    		*dim=count;
    		count=0;
    		sort1(p_max, dim);
    		*m= (int) p_max[0];
    
    		if(*m<*n) 
    		{
    			for( i=1 ; i<=(*n-*m) ; i++ ) d[*m+i]= -d[*m+i];
    		}
    
    		index1 = ip[*m]+1;
    		index2 = p[index1 + d[*m]];
    		p[index1] = p[index1 + d[*m]];
    		p[index1 + d[*m]] = *m;
    		tmp = ip[index2];
    		ip[index2] = ip[*m];
    		ip[*m] = tmp;
    
    	  }while(*m!=1);
    
    }
    
    
    poi aggiustalo alle tue esigenze (un passo da poco, penso). buon lavoro
Devi accedere o registrarti per scrivere nel forum
1 risposte