Würfelkombinationen bei 4 Würfeln



  • Hallo!

    Ich benötige bei folgender Aufgabe etwas Hilfe, da ich leider überhaupt keine Idee habe wie ich das machen soll 😃

    Ich habe 4 Würfel und es soll ausgegeben werden, welche verschiedenen Möglichkeiten es bei einer bestimmten Augensumme gibt.

    Beispiel:

    Augensumme: 6
    Es gibt 2 Möglichkeiten, eine Augensumme von 6 zu erreichen.
    Möglichkeit 1: (1,1,1,3)
    Möglichkeit 2: (1,1,2,2)

    Wäre nett, wenn mir jemand weiterhelfen könnte. Ich glaube auch, dass diese Aufgabe noch ein paar andere hier interessieren könnte 😉



  • Keiner ne Idee?





  • Danke aber wie die Anzahl der Möglichkeiten für eine bestimmte Augensumme berechnet wird, weiß ich schon. Mich interessiert die Berechnung der verschiedenen Würfel-Variationen bei einer bestimmten Augensumme.

    Ich will das ganze übrigens in C programmieren 🙂



  • Sorry, verlesen. Die verschiedenen Kombinationen zu berechnen, ist sogar viel einfacher als die Anzahl zu bestimmen. Wenn du dich nur für vier Würfel interessierst, kannst du es iterativ schreiben:

    for(int i = 1; i <= 6; ++i)
    {
    	for(int j = 1; j <= 6; ++j)
    	{
    		for(int k = 1; k <= 6; ++k)
    		{
    			int l = sum - i - j - k;
    			if(l >= 1 && l <= 6)
    				cout << i << ", " << j << ", " << k << ", " << l;
    		}
    	}
    }
    

    Geht natürlich viel schöner. Ist nur als erste Anregung gedacht. Wenn auch die Würfelanzahl variabel ist, ist die einfachste Vorgehensweise rekursiv. Überleg dir mal eine Funktionsdefinition für

    void printCombinations(int sum, int numberOfDicesLeft);
    


  • @Michael E.: Ich glaube, refeilras will die Kombinationen für eine bestimmte Augensumme ausgeben.

    Ich würde eine std::map<int, std::vector<std::vector<int> > > erstellen, die zu jeder Augensumme die verschiedenen Würfelkombinationen speichert. Die Kombinationen kannst du mit einer rekursiven Funktion oder vier Schleifen wie von Michael E. geschrieben zur Map hinzufügen. Danach kannst du einen oder mehrere Mapeinträge ausgeben lassen.



  • wxSkip schrieb:

    @Michael E.: Ich glaube, refeilras will die Kombinationen für eine bestimmte Augensumme ausgeben.

    Ja, die gewünschte Summe ist in der Variablen sum gespeichert.



  • Michael E. schrieb:

    wxSkip schrieb:

    @Michael E.: Ich glaube, refeilras will die Kombinationen für eine bestimmte Augensumme ausgeben.

    Ja, die gewünschte Summe ist in der Variablen sum gespeichert.

    Da war ich wohl etwas zu voreilig. 🙄



  • So ich habe das jetzt wie folgt gelöst:

    #include <stdio.h>
    
    int main(void) {
        int augensumme ;
    
        printf("Bitte Zahl eingeben: ");
        scanf("%i",&augensumme);
    
        int w1, w2, w3, w4,mk;
    
        for (w1 = 1; w1 <= 6; w1++)
            for (w2 = w1; w2 <= 6; w2++)
                for (w3 = w2; w3 <= 6; w3++)
                    for (w4= w3; w4 <= 6; w4++)
                    if (w1+w2+w3+w4 == augensumme)
    
                        printf("Möglichkeit %i: %d - %d - %d - %d\n",mk, w1, w2, w3,w4);
    
    }
    

    Das funktioniert wunderbar, aber jetzt möchte ich gerne noch, dass er mir für mk die entsprechende Möglichkeit anzeigt, da mir das programm später folgendes anzeigen soll:
    z.B

    Bitte Zahl eingeben: 6
    Möglichkeit 1: (1,1,1,3)
    Möglichkeit 2: (1,1,2,2)
    Es gibt 2 Möglichkeiten eine Augensumme von 6 zu erreichen.

    Irgendwie muss er das ja die Möglichkeiten mitzählen können.



  • Dann schreib halt ++mk in die Ausgabe.



  • refielras schrieb:

    Augensumme: 6
    Es gibt 2 Möglichkeiten, eine Augensumme von 6 zu erreichen.
    Möglichkeit 1: (1,1,1,3)
    Möglichkeit 2: (1,1,2,2)

    Je nachdem, wie du zählst, geht da noch was ...
    Möglichkeit 3: (3,1,1,1)
    Möglichkeit 4: (1,2,2,1)
    :::

    Man kann das auch intelligenter suchen. Stichwort: Branch and Bound. Implementiert man meist rekursiv.


Anmelden zum Antworten