Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++ Würfelmöglichkeiten (https://www.delphipraxis.net/164239-wuerfelmoeglichkeiten.html)

Blamaster 3. Nov 2011 19:32

Würfelmöglichkeiten
 
Hi,

ich hänge gerade einem kleinen Problem (Programmiert werden muss mit c :( )

Man hat 3 Würfel und soll nun eine Augensumme eingeben (>= 3 <= 18)
Das Programm soll nun anzeigen wie viele Möglichkeiten es gibt mit den 3 Würfeln auf die Augensumme zu kommen.

Das habe ich jetzt durch eine 3 fach verschachtelte For Schleife gelöst, sprich für jeden Würfel eine For. Das funktioniert soweit auch.

Nun soll das ganze aber noch so optimiert werden, dass gleiche Kombinationen nur einmal ausgegeben werden.

Hier mal ein Beispiel für die Augensumme 6:
2+2+2
1+2+3
1+1+4

Was nicht ausgegeben werden soll ist:
2+2+2
2+2+2
2+2+2
1+2+3
2+1+3
3+1+2
....

sprich die Reihenfolge der Würfel soll keine Rolle mehr spielen und 3+1+2 ist gleich anzusheen wie 2+3+1.

Hat jemand eine Idee wie sich das umsetzen lässt ?
Ich befürchte das es dafür eine ganz banale Lösung geht und ich wieder viel zu kompliziert denke.

Bummi 3. Nov 2011 19:39

AW: Würfelmöglichkeiten
 
vor dem Einfügen in das Recordarray (z1,z2,z3,Anzahl), oder in die Stringliste die 3 Ergebnisse sortieren und schauen ob der Eintrag schon vorhanden ist ..

Blamaster 3. Nov 2011 20:05

AW: Würfelmöglichkeiten
 
Naja Recordlisten und Stringlisten gibt es in C ja leider nicht wirklich.

Haeb jetzt mal 3 Arrays angelegt sprich ein Array pro Würfel.

Code:
for (i = 1; i <= 6; i++)
{
  for (j = 1; j <= 6; j++)
  {
    for (k = 1; k <= 6; k++)
    {
      if (i + j + k = augensumme)
      {
       // Hier steht fest das Kombination zu augensumme führt
      }
    }
  }
}
Jetzt könnte ich noch eine zusätzliche Schleife benutzen, die das Array durchläuft und dabei auf folgenden varianten prüft

Code:
if ((wuerfel1[x] == i) & (wuerfel2[x] == j) & (wuerfel3[x] == k))
if ((wuerfel1[x] == i) & (wuerfel2[x] == k) & (wuerfel3[x] == j))
if ((wuerfel1[x] == j) & (wuerfel2[x] == i) & (wuerfel3[x] == k))
if ((wuerfel1[x] == j) & (wuerfel2[x] == k) & (wuerfel3[x] == i))
if ((wuerfel1[x] == k) & (wuerfel2[x] == i) & (wuerfel3[x] == j))
if ((wuerfel1[x] == k) & (wuerfel2[x] == j) & (wuerfel3[x] == i))
und wenn eins davon zutrifft die Würfel nicht ins Array aufnehmen. Allerdings wirkt mir das irgendwie recht unsauber.

patti 3. Nov 2011 20:16

AW: Würfelmöglichkeiten
 
Hoffe, ich erzähle jetzt keinen Schmarn, aber ich würde das so lösen:

Code:
#include <stdio.h>

void main(void) {
   int augensumme = 6;
   //
   int w1, w2, w3;
   //
   for (w1 = 1; w1 <= 6; w1++)
      for (w2 = w1; w2 <= 6; w2++)
         for (w3 = w2; w3 <= 6; w3++)
            if (w1+w2+w3 == augensumme)
               printf("%d - %d - %d\n", w1, w2, w3);
}
Für w2 und w3 werden nicht alle Werte probiert, sondern nur diejenigen, die größer/gleich w1 bzw. w2 sind.

Damit bekommst du die Sortierung quasi "geschenkt".

Blamaster 3. Nov 2011 20:52

AW: Würfelmöglichkeiten
 
Genau das hatte ich schon veruscht und kam zum falschen Ergebnis.
Nun nochmal probiert und es geht, vermutlich eine Varaible vertauscht :roll:

Danke :)

patti 4. Nov 2011 10:57

AW: Würfelmöglichkeiten
 
Gern geschehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz