Knobelspielproblem - Türme von Hanoi

  • geschlossen
  • C#

  • xparet0209
  • 1887 Aufrufe 1 Antwort

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Knobelspielproblem - Türme von Hanoi

    hi liebe community
    ich habe wieder ein problem
    und zwar betrifft es das oben genannte spiel: "Türme von Hanoi"

    ihr könnt es euch allgemein bei wiki durchlesen (dazu auf den Names klicken)
    aber kurzgesagt:
    - 3 türme
    - n scheiben unterschiedlicher größe
    - nur kleinere scheiben dürfen auf größere
    - immer nur eine scheibe pro zug

    am anfang sind sie der größe nach geordnet (groß unten)
    aufgabe ist es nun die scheiben den regeln nach auf den letzten turm zu bringen (wieder groß unten)


    der algorithmus ist bei 3 türmen noch relativ einfach (rekursiv)
    mein problem ist es nun den algortihmus auf n türme zu verallgemeinern

    könnte mir jmd da helfen?
    mfg xparet0209

    PS:
    quellcode wird hinzugefügt
    vllt visualisiere ich meine idee auch noch...
    [SIZE="4"][FONT="Comic Sans MS"]Ich knalle keine Menschen ab, sonder treffe die Hitbox eines Polygonmodells.[/FONT][/SIZE]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von xparet0209 ()

  • Code:
    erster Aufruf (start)

    PHP-Quellcode

    1. ....
    2. stufe += 1;
    3. moveTowers(Towers, 0, anz_scheiben, anz_towers - 1); // bewegt ersten stapel auf letzten
    4. stufe -= 1;
    5. ....


    PHP-Quellcode

    1. static Stack<int>[] moveTowers(Stack<int>[] Towers, int quellTurm, int org_nElemente, int zielTurm)
    2. {
    3. //algorithmus nutzt nur einen hilfsturm aus
    4. int nElemente = org_nElemente;
    5. int[] tempZielArr = findTemp(Towers,quellTurm,zielTurm);
    6. if (nElemente == 1 || nElemente == 0 )
    7. {
    8. Towers[zielTurm].push(Towers[quellTurm].pop()); //
    9. showTowers(Towers);
    10. moves++;
    11. }
    12. else
    13. {
    14. // temp ausfüllen
    15. for (int a = 0; a < tempZielArr.Length; a++)
    16. {
    17. if (a == 0)
    18. {
    19. nElemente = nElemente - (tempZielArr.Length - a);
    20. }
    21. else
    22. {
    23. nElemente = 1;
    24. }
    25. //if (Towers[quellTurm].size() - nElemente > 0) // ist falsch wenn zu viele hilfstürme da sind wird aber nciht erkannt wenn noch andere zahlen darunter liegen
    26. if (org_nElemente - nElemente-a > 0 )
    27. {
    28. stufe += 1;
    29. Towers = moveTowers(Towers, quellTurm, nElemente, tempZielArr[a]);
    30. stufe -= 1;
    31. }
    32. }
    33. stufe += 1;
    34. Towers = moveTowers(Towers, quellTurm, 1, zielTurm); // letztes element auf ziel turm
    35. stufe -= 1;
    36. // temp aufräumen auf ziel
    37. for (int a = tempZielArr.Length - 1; a >= 0; a--)
    38. {
    39. if (Towers[tempZielArr[a]].top() != 0)
    40. {
    41. stufe += 1;
    42. Towers = moveTowers(Towers, tempZielArr[a], nElemente, zielTurm);
    43. stufe -= 1;
    44. }
    45. }
    46. }
    47. return Towers;
    48. }
    Alles anzeigen


    PHP-Quellcode

    1. static int[] findTemp(Stack<int>[]Towers,int quellTurm, int zielTurm)
    2. {
    3. int[] tempZielArr = new int[Towers.Length-2];
    4. int tempZielArrCounter = 0;
    5. // temp finden
    6. for (int i = 0; i < Towers.Length; i++)
    7. {
    8. if ((i != quellTurm && i != zielTurm) && (Towers[quellTurm].top() < Towers[i].top() || Towers[i].top() == 0))
    9. {
    10. tempZielArr[tempZielArrCounter] = i;
    11. tempZielArrCounter++;
    12. }
    13. }
    14. return tempZielArr;
    15. }
    Alles anzeigen


    zum quellcode:
    ich habe eine eigene stack klasse und ne show methode
    dies dürfte euch aber eig nicht interessiert, da nicht notwendig zum verständnis ist :)

    push - rauflegen
    pop - wegwerfen (liefert weggeworfenen wert zurück)
    top - oberster wert
    size - größe

    ich glaube ich erkläre die funktionsweise das algorithmus am besten visual:
    (hier mit 3 türmen)





    das problem liegt in diesem beispiel (4 türme , 4 scheiben)


    soweit läuft alles wie geplant
    doch jetzt:
    [SIZE="4"][FONT="Comic Sans MS"]Ich knalle keine Menschen ab, sonder treffe die Hitbox eines Polygonmodells.[/FONT][/SIZE]

    Dieser Beitrag wurde bereits 15 mal editiert, zuletzt von xparet0209 ()