Προς το περιεχόμενο

Πιθανοί συνδιασμοί (C++)


xaotikos

Προτεινόμενες αναρτήσεις

Δημοσ.

Λοιπόν έχω ένα πλήθος αριθμών i και ψάχνω να βρώ όλους τους πιθανούς συνδιασμούς μεταξύ τους...

Αναλυτικότερα: Έχω έναν μονοδιάστατο πίνακα έστω Array και ψάχνω μια ρουτίνα που θα μπορώ αλλάζοντας μόνο μια μεταβλητή να βρω όλους τους πιθανούς συνδιασμούς. Από ανα 2 εως και ανα i.

 

Για παράδειγμα έστω πίνακας Array[4]:

Αρχικά όλους τους πιθανούς ανα 2:

Array[0] &Array[1],

Array[0] &Array[2],

Array[0] &Array[3],

Array[1] &Array[2],

Array[1] &Array[3],

Array[2] &Array[3]

 

 

Το πλήθος των συνδιασμών είναι Ν!/κ!(Ν-κ)! όπου Ν το πλήθος των στοιχείων του πίνακα στο παράδειγμα 4 και κ οι συνδιαζόμενοι αριθμοί-2 Άρα στο παράδειγμα έχουμε 6 συνδιασμούς και τα αποτελέσματα κρατιούνται σε έναν πίνακα πχ **Results (που τώρα είναι Results[6][2])

 

Επομένω ψάχνω να φτιάξω μια ρουτίνα που να δίνω μόνο τον συνδιασμό (ανα 2,3 κ.ο.κ)και να μπορεί να μου βρίσκει όλους τους αντίστοιχους συνδιασμούς του μονοδιάστατου πίνακα (ο συνδιασμός 0,1 είναι ίδιος με το 1,0). Φυσικά θα πρέπει ο πίνακας που θα κρατάει τους συνδιασμούς να γίνεται realloc ώστε να μπορεί να κρατάει από 2άδες μέχρι και πχ 40άδες αναλόγως το μέγεθος του μονοδιάστατου πίνακα και τα συνδιαζόμενα στοιχεία .

 

Υποψιάζομαι ότι θέλει μια recursive ρουτίνα αλλά όσο και να έσπασα το κεφάλι μου δεν μπόρεσα να φτιάξω κάποιο αλγόριθμο...

 

Πεδεύομαι αρκετά με ένα project (πτυχιακή μου είναι) και τώρα το έχω βάλει να κάνει συνδιασμούς μέχρι ανα 4 (με λούπες και επαναλήψεις) πράγμα που πέρα από σωστό δεν μπορεί να χρησιμοποιηθεί για όλους τους πιθανούς συνδιασμούς...

 

Ευχαριστώ προκαταβολικά.

Δημοσ.

Ευχαριστώ φίλε μου. (αν υπάρχει κάπου μαζεμένο το pdf να το κατεβασω.....)

Το κοίταξα στα πεταχτά αλλα δεν είδα τίποτα σχετικό. Θα το ψάξω περισσότερο...

Δημοσ.

file eiha ki egw to idio provlima kapote kai meta apo kabosi skepsi to katafera...

mou pire ligi wra na to xanathimithw gia na sou ftiaxw to example...

 

apo 10 ana 10 sindiasmous kai panw argei poly...

 

to programmataki afto sou zitaei to i (arithmos stoiheiwn) kai tis times twn i stoiheiwn kai sou typwnei se ena file (results.txt) olous tous dynatous sindiasmous apo :

i ana 2 -ews- i ana i

 

 

skepsou to san ena noito pinaka, an as poume eihes 4 stoiheia

arr[0] = 1 , arr[1] = 2 , arr[2] = 3 , arr[3] = 4

 

tote tha eihes afton ton pinaka :

 

1 1 1 1

2 2 2 2

3 3 3 3

4 4 4 4

 

aftos o pinakas einai noitos , dld den ton ylopoieis

to mono pou hreiazesai einai ena allo array p[4] pou tha periehei enan arithmo deikti gia kathe stili.

arhika tha ehoume : p[0] = 0 , p[1] = 0 , p[2] = 0 , p[3] = 0

 

ara o sindiasmos tha einai 1 1 1 1

 

sti sineheia kathe fora tha afxanoume to p[3] kata 1, ara sti sineheia tha ehoume :

1 1 1 2

 

an to p[3] ginei megalitero tou 3 tote to p[3] tha ginei 0 kai to p[2]++ ...

san to dekadiko systima doulevei...

 

des kai to example kai tha katalaveis

hrisimopoiw pinakes egw edw gia na kanw ti douleia mou

twra an esy thes kati me "reallocation" tha prepei na to kaneis monos sou

edw einai mono i lisi gia tous sindiasmous

 

 

 

>
include <stdio.h>

int main() {

int arr[9];     //to array pou periehei ta stoiheia mas (max 9,to megalwneis an thes alla den to sinistw giati argei)
int p[9];       //o pinakas me tous deiktes mas ston noito pinaka (an ehoume arr[i] tote tha ehoume p[i])
int i,k,x,y,print_it,done,total;
FILE *f1;

printf("Dwse i : "); scanf("%d",&i);    //o arithmos twn stoiheiwn (mehri 6 edw giati ehoume arr[6] )



for (x=0;x<i;x++) {
	printf("Dwse arr[%d] : ",x); scanf("%d",&arr[x]);    // diavazoume ta stoiheia apo to keybord
       }
       printf("\n\n");





if ((f1=fopen("results.txt","w"))==NULL) {        //anoigoume to arheio pou tha apothikefsoume
   		printf("cannot open file...");
	return 0;
 	}


for (k=2;k<=i;k++) {                              // gia k apo 2 mehri i , dld o arithmos twn sindiasmwn


	for (x=0;x<i;x++) p[x]=0;                 //thetoume olous tous deiktes sto prwto stoiheio kathe stilis tou noitou pinaka


      		 total = 0;                               //to total sto telos tha periehei tous total sindiasmous

	do {                                      //epanelave
                                                         
		done = 1;                            //eleghoume an ehoun teleiwsei oi sindiasmoi
		for (x=0;x<k;x++)                    //dld an oloi oi deiktes einai isoi me i-1 (dld me to teleftaio stoiheio)
			if (p[x] != i-1) done = 0;   //an nai tote typwnoume ton teleftaio sindiasmo kai sinehizoume

              		print_it = 1;
		for (x=0;x<k;x++)                                //eleghoume an se afton ton sindiasmo ehoume idia stoiheia
			for (y=x+1;y<k;y++)                      //dld an 2 or perissoteroi deiktes ehoun tin idia timi
				if (p[x] == p[y]) print_it = 0;  //an nai, tote den typwnoume ton sindiasmo

               	if (print_it) {                                          // an ohi
			for (x=0;x<k;x++) fprintf(f1,"%d ",arr[p[x]]);   // tote typwnoume ton current sindiasmo
			fprintf(f1,"\n");
                       	total ++;
		}


		p[k-1]++;                    //afxanoume ton teleftaio deikti kata 1
		for (x=k-1;x>0;x--)          //eleghoume apo ton teleftaio deikti mehri ton 2o an kapoios perase to orio
			if (p[x] > i-1) {    //an nai, tote thetoume ton deikti pou perase to orio iso me 0, kai afxanoume kata 1 ton amesws proigoumeno
				p[x] = 0;
				p[x-1]++;
			}

	} while (!done);                    //an den teleiwsame tote pame gia ton epomeno sindiasmo alliws sinehizoume

	fprintf(f1,"\nSindiasmoi twn %d ana %d -> %d\n\n\n",i,k,total);  //typwnoume kapoia info

}             // sinehizoume gia perissoterous sindiasmous

fclose(f1);
printf("\n\nResults saved in results.txt ...");


return 0;


}

Δημοσ.

Ωραίος!!! Ευχαριστώ για το χρόνο σου. Ελπίζω να βρω χρόνο να το υλοποιήσω αύριο...θα στείλω αποτελέσματα

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...