home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 08 / grdlagen / hanoi_nn.bas < prev    next >
Encoding:
BASIC Source File  |  1989-05-31  |  3.8 KB  |  105 lines

  1. 10  '* --------------------------------------------------- *
  2. 20  '*               TURM von HANOI                        *
  3. 22  '* mit einem nicht - rekursiven (!) Verfahren umsetzen *
  4. 24  '* Hanoi_NN.BAS, Fassung ohne GOTO (und ohne GOSUB)    *
  5. 26  '*      (C) 1986, 1989  W.D.Meisel & TOOLBOX           *
  6. 30  '* --------------------------------------------------- *
  7. 40  '* ALGORITHMUS: Bei jedem ungeraden Schritt rückt das  *
  8. 42  '*              kleinste Stockwerk einen Platz nach    *
  9. 44  '*              rechts und dann das jeweils  kleinere  *
  10. 46  '*              der beiden anderen auf den noch nicht  *
  11. 48  '*              benutzten Platz                        *
  12. 50   DEFINT A - Z
  13. 60   DIM HOEHE(2),TEIL(2), FORM$(9), PLATZ(2,9), PLATZ$(2,9)
  14. 70   KEY OFF : CLS
  15. 80   EINGABE  = -1
  16. 90   WHILE EINGABE         'Eingabe mit Zulässigkeitsprüfung
  17. 100    LOCATE 4,20
  18. 110    PRINT  SPACE$(58)
  19. 120    LOCATE 3,,1,1,13
  20. 130    PRINT TAB(11) "Bitte Höhe des Turms ( 0 < N < 10 )";
  21. 140    N$ = ""
  22. 150    WHILE N$ = ""
  23. 160      N$ = INKEY$
  24. 170    WEND
  25. 180    N = VAL(N$)
  26. 190    WHILE 0 < N AND N < 10 AND EINGABE = -1
  27. 200      LOCATE 3,11
  28. 210      PRINT "Eingabe"N"=" : PRINT : PRINT
  29. 220      EINGABE = 0
  30. 230    WEND
  31. 240  WEND    'Eingabe
  32. 250  HOEHE(0)   = N
  33. 260  PLATZ(0,0) = 99
  34. 270  PLATZ(1,0) = 99
  35. 280  PLATZ(2,0) = 99
  36. 290  FOR J = 1 TO N           'Vorbereitung der Ausgabe-Form
  37. 300    PLATZ(0,J) = N+1-J
  38. 310    FORM$(J)   = STRING$(N+1-J,32)+STRING$(J+J-1,177)
  39. 320  NEXT              'Ausgabe-Form
  40. 330  LOCATE ,,0
  41. 340  TEIL(0) = -1
  42. 350  WHILE TEIL(0)   ' Überschrift u. Ausgabe zu Schritt 0
  43. 360    TEIL(0) = 0
  44. 370    PRINT TAB(11);
  45. 375    PRINT "Schritt" TAB(22)"START"TAB(42)"MITTE"TAB(61);
  46. 378    PRINT "Z I E L"
  47. 380    AUSGABE = -1
  48. 390  WEND             'Teil(0)
  49. 400  Z = 2-N MOD 2
  50. 410  M = 3-Z           'Dadurch  ist nur eine Abfrage in
  51. 415                    'Zeile 580 erforderlich
  52. 420  T! = TIMER        'Beginn Zeitmessung
  53. 430  ZYKLUS =-1
  54. 440  WHILE ZYKLUS      'Das eigentliche Hauptprogramm
  55. 450    WHILE TEIL(1)   'Setze das `kleinste' Stockwerk um
  56. 460      TEIL(1) = 0
  57. 470      PLATZ(C, HOEHE(C)) = 0
  58. 480      HOEHE(C) = HOEHE(C) - 1
  59. 490      E = C
  60. 500      C = (C+1) MOD 3
  61. 510      D = (C+1) MOD 3
  62. 520      HOEHE(C) = HOEHE(C) + 1
  63. 530      PLATZ(C,HOEHE(C)) = 1
  64. 540      AUSGABE = -1
  65. 550    WEND            'Teil(1)
  66. 560    WHILE TEIL(2)   'Setze das `andere' Stockwerk um
  67. 570      TEIL(2) = 0
  68. 580      IF HOEHE(Z) = N THEN _
  69.            LOCATE ,,1,12,13 : PRINT TAB(21)_
  70.            "Platz A"  TAB(41)"Platz B" _
  71.            TAB(61) "Platz C" : PRINT : PRINT TAB(10) USING _
  72.            " Dauer =   ###.#      sec."; TIMER-T! : END
  73. 590      IF PLATZ(D,HOEHE(D))>PLATZ(E,HOEHE(E))THEN _
  74.            A=D : B=E _
  75.          ELSE A=E :  B=D
  76. 600      STOCKWERK = PLATZ(B, HOEHE(B))
  77. 610      PLATZ(B,HOEHE(B)) = 0
  78. 620      HOEHE(B) = HOEHE(B) - 1
  79. 630      HOEHE(A) = HOEHE(A) + 1
  80. 640      PLATZ(A, HOEHE(A)) = STOCKWERK
  81. 650      AUSGABE = -1
  82. 660    WEND            'Teil(2)
  83.                               'Zeitmessung-Ende s. Zeile 580
  84. 670    WHILE AUSGABE
  85. 680      PRINT
  86. 690      LOCATE 9  'ohne LOCATE 9  ergibt `laufende' Ausgabe
  87. 700      PRINT TAB(10)SCHRITT;
  88. 710      SCHRITT = SCHRITT + 1
  89. 720      FOR J = N TO 1 STEP-1
  90. 730        FOR K = 0 TO 2
  91. 740          IF PLATZ(K,J) = 0 THEN _
  92.                PLATZ$(K,J) = STRING$(18,32) _
  93.              ELSE _
  94.                PLATZ$(K,J) = FORM$(PLATZ(K,J))
  95. 750        NEXT
  96. 760        PRINT TAB(24-N) PLATZ$(0,J) TAB(44-N) _
  97.                  PLATZ$(M,J) TAB(64-N) PLATZ$(Z,J)
  98. 770      NEXT
  99. 780      AUSGABE = 0
  100. 790    WEND            'Ausgabe
  101. 800    X = 1 - X  : TEIL(2 - X) = -1
  102. 810  WEND    'Zyklus
  103.        ' Lediglich e i n m a l  wird der Teil(0) ausgeführt,
  104.        ' sonst Wechselschalter zwischen Teil(1) und Teil(2)
  105.