home *** CD-ROM | disk | FTP | other *** search
- 10 '* --------------------------------------------------- *
- 20 '* TURM von HANOI *
- 22 '* mit einem nicht - rekursiven (!) Verfahren umsetzen *
- 24 '* Hanoi_NN.BAS, Fassung ohne GOTO (und ohne GOSUB) *
- 26 '* (C) 1986, 1989 W.D.Meisel & TOOLBOX *
- 30 '* --------------------------------------------------- *
- 40 '* ALGORITHMUS: Bei jedem ungeraden Schritt rückt das *
- 42 '* kleinste Stockwerk einen Platz nach *
- 44 '* rechts und dann das jeweils kleinere *
- 46 '* der beiden anderen auf den noch nicht *
- 48 '* benutzten Platz *
- 50 DEFINT A - Z
- 60 DIM HOEHE(2),TEIL(2), FORM$(9), PLATZ(2,9), PLATZ$(2,9)
- 70 KEY OFF : CLS
- 80 EINGABE = -1
- 90 WHILE EINGABE 'Eingabe mit Zulässigkeitsprüfung
- 100 LOCATE 4,20
- 110 PRINT SPACE$(58)
- 120 LOCATE 3,,1,1,13
- 130 PRINT TAB(11) "Bitte Höhe des Turms ( 0 < N < 10 )";
- 140 N$ = ""
- 150 WHILE N$ = ""
- 160 N$ = INKEY$
- 170 WEND
- 180 N = VAL(N$)
- 190 WHILE 0 < N AND N < 10 AND EINGABE = -1
- 200 LOCATE 3,11
- 210 PRINT "Eingabe"N"=" : PRINT : PRINT
- 220 EINGABE = 0
- 230 WEND
- 240 WEND 'Eingabe
- 250 HOEHE(0) = N
- 260 PLATZ(0,0) = 99
- 270 PLATZ(1,0) = 99
- 280 PLATZ(2,0) = 99
- 290 FOR J = 1 TO N 'Vorbereitung der Ausgabe-Form
- 300 PLATZ(0,J) = N+1-J
- 310 FORM$(J) = STRING$(N+1-J,32)+STRING$(J+J-1,177)
- 320 NEXT 'Ausgabe-Form
- 330 LOCATE ,,0
- 340 TEIL(0) = -1
- 350 WHILE TEIL(0) ' Überschrift u. Ausgabe zu Schritt 0
- 360 TEIL(0) = 0
- 370 PRINT TAB(11);
- 375 PRINT "Schritt" TAB(22)"START"TAB(42)"MITTE"TAB(61);
- 378 PRINT "Z I E L"
- 380 AUSGABE = -1
- 390 WEND 'Teil(0)
- 400 Z = 2-N MOD 2
- 410 M = 3-Z 'Dadurch ist nur eine Abfrage in
- 415 'Zeile 580 erforderlich
- 420 T! = TIMER 'Beginn Zeitmessung
- 430 ZYKLUS =-1
- 440 WHILE ZYKLUS 'Das eigentliche Hauptprogramm
- 450 WHILE TEIL(1) 'Setze das `kleinste' Stockwerk um
- 460 TEIL(1) = 0
- 470 PLATZ(C, HOEHE(C)) = 0
- 480 HOEHE(C) = HOEHE(C) - 1
- 490 E = C
- 500 C = (C+1) MOD 3
- 510 D = (C+1) MOD 3
- 520 HOEHE(C) = HOEHE(C) + 1
- 530 PLATZ(C,HOEHE(C)) = 1
- 540 AUSGABE = -1
- 550 WEND 'Teil(1)
- 560 WHILE TEIL(2) 'Setze das `andere' Stockwerk um
- 570 TEIL(2) = 0
- 580 IF HOEHE(Z) = N THEN _
- LOCATE ,,1,12,13 : PRINT TAB(21)_
- "Platz A" TAB(41)"Platz B" _
- TAB(61) "Platz C" : PRINT : PRINT TAB(10) USING _
- " Dauer = ###.# sec."; TIMER-T! : END
- 590 IF PLATZ(D,HOEHE(D))>PLATZ(E,HOEHE(E))THEN _
- A=D : B=E _
- ELSE A=E : B=D
- 600 STOCKWERK = PLATZ(B, HOEHE(B))
- 610 PLATZ(B,HOEHE(B)) = 0
- 620 HOEHE(B) = HOEHE(B) - 1
- 630 HOEHE(A) = HOEHE(A) + 1
- 640 PLATZ(A, HOEHE(A)) = STOCKWERK
- 650 AUSGABE = -1
- 660 WEND 'Teil(2)
- 'Zeitmessung-Ende s. Zeile 580
- 670 WHILE AUSGABE
- 680 PRINT
- 690 LOCATE 9 'ohne LOCATE 9 ergibt `laufende' Ausgabe
- 700 PRINT TAB(10)SCHRITT;
- 710 SCHRITT = SCHRITT + 1
- 720 FOR J = N TO 1 STEP-1
- 730 FOR K = 0 TO 2
- 740 IF PLATZ(K,J) = 0 THEN _
- PLATZ$(K,J) = STRING$(18,32) _
- ELSE _
- PLATZ$(K,J) = FORM$(PLATZ(K,J))
- 750 NEXT
- 760 PRINT TAB(24-N) PLATZ$(0,J) TAB(44-N) _
- PLATZ$(M,J) TAB(64-N) PLATZ$(Z,J)
- 770 NEXT
- 780 AUSGABE = 0
- 790 WEND 'Ausgabe
- 800 X = 1 - X : TEIL(2 - X) = -1
- 810 WEND 'Zyklus
- ' Lediglich e i n m a l wird der Teil(0) ausgeführt,
- ' sonst Wechselschalter zwischen Teil(1) und Teil(2)