Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.67 KB | None | 0 0
  1.  
  2. /**
  3. * Diese Klasse simuliert ein Hanoi-Spiel mit Hilfe der Stapel-, Element- und
  4. * Scheiben-Klasse. Die Stapelklasse wurde dabei leicht verändert, sodass die
  5. * Methode top() nicht mehr den Inhalt eines Elementes, sondern das Element selbst
  6. * zurückgibt.
  7. * Diese Klasse dient der Übung von Rekursionen.
  8. *
  9. * @author C. Rauwolf
  10. * @version 10.11.2014
  11. */
  12. public class Hanoi
  13. {
  14. private Stack<Scheibe> turm1, turm2, turm3;
  15.  
  16. /**
  17. * Erzeugt drei Stapel und n Scheiben, welche in der richtigen Reihenfolge
  18. * auf den 1. Stapel gelegt werden (von groß nach klein).
  19. *
  20. * @param n Höhe des Anfangsturms
  21. */
  22. public Hanoi(int n)
  23. {
  24. turm1= new Stack<Scheibe>();
  25. turm2= new Stack<Scheibe>();
  26. turm3= new Stack<Scheibe>();
  27.  
  28. // Erzeugt n Scheiben und legt sie auf den 1. Stapel
  29. for(int i = n; i>0; i--){
  30. Scheibe neueScheibe = new Scheibe(i);
  31. turm1.push(neueScheibe);
  32. }
  33. }
  34.  
  35. /**
  36. * Die Methode bewegt die oberste Scheibe von Turm "start" nach Turm "ziel".
  37. *
  38. * @param start Index des Startstapels
  39. * @param ziel Index des Zielstapels
  40. */
  41. public void move(int start, int ziel){
  42. Stack<Scheibe> tVon, tNach;
  43. // Hier werden die Start- und Zielreferenzen gesetzt um danach
  44. // einfacher tauschen zu können.
  45. switch(start){
  46. case 1: tVon=turm1; break;
  47. case 2: tVon=turm2; break;
  48. case 3: tVon=turm3; break;
  49. default:tVon=turm1; break;
  50. }
  51. switch(ziel){
  52. case 1: tNach=turm1; break;
  53. case 2: tNach=turm2; break;
  54. case 3: tNach=turm3; break;
  55. default:tNach=turm1; break;
  56. }
  57. // Eigentlicher Tausch
  58. Scheibe tmpScheibe = tVon.top();
  59. tNach.push(tmpScheibe);
  60. tVon.pop();
  61. }
  62.  
  63. /**
  64. * Die Methode gibt den Inhalt aller drei Stapel in der Konsole aus.
  65. */
  66. public void printStacks(){
  67. // zum Zwischenspeichern der Werte jedes Turmes
  68. String tmpString;
  69. Stack<Scheibe> tmpStack = new Stack<Scheibe>();
  70. Stack<Scheibe> aktTurm;
  71. Scheibe tmpScheibe;
  72.  
  73.  
  74. for(int i=0; i<3; i++){
  75. System.out.print((i+1)+"ter Stapel: |-");
  76. tmpString = "";
  77.  
  78. switch(i){
  79. case 0: aktTurm=turm1; break;
  80. case 1: aktTurm=turm2; break;
  81. case 2: aktTurm=turm3; break;
  82. default:aktTurm=turm1; break;
  83. }
  84.  
  85. // Alle Scheibengrößen des aktuellen Stapels ausgeben
  86. while(!aktTurm.isEmpty()){
  87. tmpScheibe=aktTurm.top();
  88. tmpStack.push(tmpScheibe);
  89. tmpString+=tmpScheibe.getGroesse();
  90. aktTurm.pop();
  91. }
  92.  
  93. for(int s=tmpString.length()-1; s>=0; s--){
  94. System.out.print(tmpString.charAt(s));
  95. }
  96.  
  97. // Aktuellen Stapel aus tmpStapel "wiederherstellen"
  98. while(!tmpStack.isEmpty()){
  99. aktTurm.push(tmpStack.top());
  100. tmpStack.pop();
  101. }
  102.  
  103. System.out.println("");
  104. }
  105. System.out.println("");
  106. }
  107.  
  108.  
  109. /**
  110. * Gibt die Anzahl der Schritte aus die benötigt werden um einen Turm mit
  111. * "anzScheiben" vielen Scheiben von einen auf einen anderen Stapel zu legen.
  112. *
  113. * @param anzScheiben Höhe des Anfangsturms
  114. * @return Minimale Anzahl der benötigten Züge
  115. */
  116. public int getNumberOfMoves(int anzScheiben){
  117. // Abbruchbedingung (für welchen Wert können wir das Problem lösen?)
  118. if(anzScheiben == 1) return 1;
  119. // Rekursionsschritt (auf welches einfachere Problem können wir unser Problem zurückführen?)
  120. return getNumberOfMoves(anzScheiben - 1) * 2 + 1;
  121. }
  122.  
  123. /**
  124. * Die Methode soll einen Turm mit "anzScheiben" vielen Scheiben mit Hilfe
  125. * eines Hilfstapels "hilf" vom Spapel "start" auf den Stapel "ziel" überführen
  126. * und dabei die Spielregeln des Hanoi-Spiels berücksichtigen. Die Lösung soll
  127. * rekursiv sein (Zusatz: Es ist auch eine iterative Lösung möglich).
  128. *
  129. * @param anzScheiben Gibt an wie hoch der Turm ist, der verlegt werden soll
  130. * @param start Index des Startstapels
  131. * @param hilf Index des Hilfstapels
  132. * @param ziel Index des Zielstapels
  133. */
  134. public void solve(int anzScheiben, int start, int hilf, int ziel){
  135.  
  136.  
  137. }
  138.  
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement