• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Array kombinieren

kasimir83

Lounge-Member
So Kopfnuss:

Gegeben sei ein zweidimensionales Array mit variabler Größe, zB:
Code:
     0   1   2   3   4   5
0   a   b   c   d
1   e   f   g   h    i    j
2   k   l
3   m   n   o  p   q
Hier soll jetzt jede Zeile mit jeder Spalte kombiniert werden, also alle Möglichkeiten. Da die Größe des Arrays vorerst unbekannt ist, fehlt mir eine Idee. Hat jemand eine?
 
Du machst ein Array der Zeilen. In dieses trägst Du dann die Spaltenelemente ein:

Array[0][0] = a;
Array[0][1] = b,
....
Array[1][0] = 1;
...
Array[3][4] = q;

Das sollte eigentlich funktionieren.
 
ich vermute mal das es damit nicht so ganz getan ist, allerdings weiß ich auch nicht wo genau dein Problem liegt. Willst du den Array generieren? Wenn ja aus was?
 
Ich weiß zwar nicht in welcher Sprache das dann sein soll, aber wie wär es, wenn du Zeile für Zeile und Spalte für Spalte mal durchgehst und die kürzeste (wirst du wohl brauchen) Länge herausfindest und anschließend deine Operationen durchführst?
 
Das wird C.
Das Array wird im Vorfeld erzeugt. Noch ein Beispiel:

Code:
  0 1 2
0 a b c
1 d e
2 f

Alle Möglichkeiten sind:
adf, aef, bdf,bef, cdf, cef

Wenn ich das über Schleifen mache habe ich imho das Problem, dass ich im Vorfeld nicht weiß, wieviele Schleifen ich da Schachteln muss. Wahrscheinlich werde ich das Array vorher noch normalisieren, aber trotzdem weiß ich halt nicht wo ich wie anfangen soll.
 
ich wird das versuchen iterative zu machen, oder du machst alle arrays gleichlang läßt die dann alle durchlaufen und löscht dann die mit länger < 3 (in deinem Fall)

hört sich interessant an, ich guck mal ob ich da ne lösung finde
 
Zuletzt bearbeitet:
Bitte sehr:

PHP:
/*errstellt alle Kombinationen*/
char**finalize(char***combine,int*count_token_length,char**final) 
{
	int ctl = *count_token_length;
	int i,j,k;
	int l = 1;
	for (i=0;i<ctl;i++) {
		j = 0;
		while(!strstr(combine[i][j],"end")) j++;
		if(j>0) l*=j;
	}	
	final = (char**)realloc(final,l*sizeof(char**));
	for (i=0;i<ctl;i++) 
	{
		k = 0;
		for(j=0;j<l;j++)
		{
			if(strstr(combine[i][k],"end")) k = 0;
			final[j] = (char*)realloc(final[j],(strlen(final[j])+strlen(combine[i][k]))*sizeof(char*));
			sprintf(final[j],"%s%s",final[j],combine[i][k]);
			k++;
		}
		final = final_sort(final,l);
	}
	*count_token_length = l;
	return final;
}

/*sortiert den Finalstring*/
char**final_sort(char**final,int l)
{
	int i,j,min;
	char*s;
	for (i=0;i<l;i++) 
	{
		min = i;
		for(j=0;j<l;j++) if(strcmp(final[min],final[j])<0) min = j;
		s = (char*)realloc(s,strlen(final[i])*sizeof(char*));
		strcpy(s,final[i]);
		final[i] = (char*)realloc(final[i],strlen(final[min])*sizeof(char*));
		strcpy(final[i],final[min]);
		final[min] = (char*)realloc(final[min],strlen(s)*sizeof(char*));
		strcpy(final[min],s);
	}
	free(s);
	return final;
}

Sind zwei (noch) ziemlich hässliche C-Funktionen, die ein Array mit sämtlichen Strings zurückgibt.
Übergeben wir das Array mit den Bestandteilen, die Länge der ersten Dimension dieses Arrays, die Länge der zweiten Dimensionen werden durch den String "end" markiert, die der Dritten durch das Stringende '\0'.
Final ist das leere Array in das die fertigen Strings geschrieben werden sollen.
Kann man theoretisch in andere Sprachen überführen, da spart man sich wenigstens das lästige Allokieren.
 
Zurück
Oben