Permutation

om1krnoy

Grünschnabel
Hallo,
ich habe gestern ein Programm geschrieben welches Permutation ausgibt. Und zwar gibt man ein 4- stelliges Wort ein und erhält alle Permutation.
Habe das ganze mit 4 for Schleifen gelöst. Jetzt habe ich aber dass Problem dass er mir bei z.B. dem Wort "halo" auch kombinationen wie hhhh ausgibt.

Code:
#include <stdio.h>
#include <string.h>

#include <math.h>

int main (void)
{
	int i, j, o, u;
	char z[4];
	
	printf("Permutationen zu einem Wort\n"
		   "===========================\n"
		   "Gib ein Wort mit 4 Zeichen ein: ");

	z[0] = getchar(); 
	z[1] = getchar();
	z[2] = getchar();
	z[3] = getchar();
	getchar ();


	for (i = 0; i <= 3; i++){
		for (j = 0; j <= 3; j++)
				for (o = 0; o <= 3; o++)
						for (u = 0; u <= 3; u++)
								if (?)
									
									printf("%c%c%c%c ", z[i], z[j], z[o], z[u]);
								
	}
					
					
			
	return 0;
}
Ich weiß dass ich noch eine if Funktion anhängen muss weiß aber nicht wie ich das überprüfen kann.
Dachte mir er soll schauen dass alle Werte von z[0] - z[1] gleich der werte z[i] - z[u] sind. Weiß aber nicht wie ich das abfragen kann.
Wäre net wenn mir jemand helfen könnte.

Gruß Benny
 
Hi,
wenn ich dich richtig verstanden habe, möchstest du das jeder Buchstabe auch nur einmal vokommt. Wenn dem so ist, musst du ab der zweiten for-Schleife übrprüfen, ob der Buchstabe schon benutzt wird.
z.B.

C++:
 if(z[i] == z[j]) continue;

Dadurch überspringt das Programm den Schleifendurchlauf. Dies müsstest du entsprechend für die anderen fors auch realisieren.

Grüße
 
Ja will ich im Prinzip schon aber wenn ich z.B. "woro" eingebe dann würde er mich ja rausschmeisen weil zwei Buchstaben gleich sind und des will ich nicht :)

Gruß
 
Achjo...das hab ich ganz unterschlagen.
Was mir sonst spontan einfällt wäre zusätzlich ein counter, der auch die Anzahl zählt und diese in der if vergleicht.
Mir fällt jedoch nicht auf die schnelle ein, ob es eine schnellere bzw effektivere Lösung gibt, da müsste ich mir dann morgen drüber mehr Gedanken machen.

Grüße
 
Ich habe mal in einem Beitrag ein Beispielprogramm in Java zum Zulosen ohne Zurücklegen veröffentlicht; die dortige Methodik kannst du leicht anpassen, um sie in deinem C-Programm zu verwenden.
Außerdem habe ich in einem anderen Beitrag eine Java-Klasse veröffentlicht, die den SEPA-Algorithmus verwendet, um bei Bedarf Permutationen iterativ liefern zu können; du darfst sie gerne als Vorlage für Klassen in C++ verwenden.
Eine englische Erklärung des SEPA-Algorithmus inklusive einer C-Implementierung findest du hier.
 
Hi.
Ich habe mal in einem Beitrag ein Beispielprogramm in Java zum Zulosen ohne Zurücklegen veröffentlicht; die dortige Methodik kannst du leicht anpassen, um sie in deinem C-Programm zu verwenden.
Außerdem habe ich in einem anderen Beitrag eine Java-Klasse veröffentlicht, die den SEPA-Algorithmus verwendet, um bei Bedarf Permutationen iterativ liefern zu können; du darfst sie gerne als Vorlage für Klassen in C++ verwenden.
Eine englische Erklärung des SEPA-Algorithmus inklusive einer C-Implementierung findest du hier.
In C++ ist der Algorithmus bereits in der STL implementiert: http://www.cplusplus.com/reference/algorithm/next_permutation/

Gruß
 
Zurück