home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 03 / forth.fth < prev    next >
Encoding:
Text File  |  1987-05-01  |  14.0 KB  |  1 lines

  1.   ACHT DAMEN                                                      Beispiel zur Lösung des 8-Damen Problems                                                                                       SCR#  Inhalt:                                                                                                                    2    Variablendefinition                                             Schreib- und Lesedefinitionen                                   Initialisieren der Damenpositionen                              Printpos zur Ausgabe der Damenstellung                                                                                     4    Prüfworte für waagerechte und diagonale Schlag-                 möglichkeit                                                                                                                6    Stellung möglich?                                                                                                                                                                         ACHT DAMEN                                                      SCR#  Inhalt:                                                                                                                    8    Herz des Programms. Aufstellen der nächsten Dame, bei           Unmöglichkeit Backtracking                                                                                                10    Programm für eine Damenposition                                                                                           12    Programm zum Ausdruck aller möglichen Lösungen                                                                                                                                                                                                                                                                                                                                                                                                                                                                           ( Acht Damen )                                                                                                                   create POSITION   0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,                                                                                                                                                                                                          : POS@   2* position + @ ;    ( Linie --- Reihe )                                                                               : POS!   2* position + ! ;    ( Reihe Linie --- )                                                                               : INIT   9 0 do 1 i pos! loop ;                                                                                                                                                                 : PRINTPOS   9 1 do i 64 + emit i pos@ . space loop cr ;                                                                                                                                   -->  ( Acht Damen       Kommentare                                                                                                    POSITION  : Array, in dem die Stellungen der Damen gespeichert              werden. Mit dem Einrichten werden die Stellungen                auch initialisiert.                                                                                                 POS@ & POS! : Worte zum Auslesen bzw. Setzen der Damen-                       positionen                                                                                                                                                                        INIT   : alle Stellungen initialisieren, d.h. Damen auf Reihe 1          Wird für die Suche nach allen Lösungen gebraucht                                                                       PRINTPOS   : druckt die Stellung der Damen aus, Linie als                    Buchstabe, Reihe numerisch                                                                                 ) -->  ( Acht Damen cont )                                                                                                             : WAAGE?   ( linie reihe --- linie 0     = unmögliche position                               linie reihe = OK )                   over 1 do dup   i pos@ =                                                 if drop 0 leave                                                 then                                                          loop ;                                                                                                                 : DIAGO?  ( linie reihe --- s.o. )                                over 1 do ( l r ) dup i pos@ - abs ( l r dist )                           2 pick ( l r dist l ) i -                                       = if drop 0 leave                                               then                                                         loop ;                                                                                                            -->  ( Acht Damen                                                                                                                     WAAGE?     Überprüft, ob eine Dame zwischen der aktuellen                  und der ersten Linie auf der gleichen Reihe steht.              Besteht eine Schlagmöglichkeit wird auf dem Stack               Linie 0  übergeben. Keine Schlagmöglichkeit =                   Linie Reihe.                                                                                                                                                                                                                                         DIAGO?     Überprüft auf Schlagen in einer Diagonalen.                     Stackübergabe wie Waage?.                                                                                                                                                                                                                                                                                    ) -->  ( Acht Damen   cont )                                                                                                           : MOEGLICH?       ( line --- line flag )                          dup pos@                                                        waage?                                                          dup if diago? then ;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     -->  ( Acht Damen                                                                                                                     MOEGLICH?   Überprüft Stellung einer Dame mittels Waage? und                Diago?. Braucht Liniennummer, übergibt Linie und                Flag. Bei Flag = True mögliche Damenstellung                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ) -->  ( Acht Damen   cont )                                                                                                           : REIHE+          ( line --- line )                                                                                               begin dup pos@                                                    8 =                                                               if 0 over pos!                                                     dup 2 =                                                         if 1 pos@ dup 8 = if drop 0 then 1+ 1 pos!                                                                                         0 2 pos!                                                     else 1-                                                         then                                                         then                                                        dup pos@ 8 < until                                              dup pos@ 1+ over pos! ;                                  -->  ( Acht Damen                                                                                                                     REIHE+              Dame wird auf Linie eine Reihe hochgesetzt        falls Ende -> Backtracking, d.h. Linie vorher bearbeiten    begin    Reihe der aktuellen Dame                                        Dame auf letzter Reihe ?                                        ja: Dame auf erste Reihe zurueck                                    Linie=B ?                                                       ja: Linie A eine Reihe weiter oder zurueck                                                                                      Dame B nach 0 ! <damit es mit 1 weitergeht!>                nein: Linie vorher nehmen                                                                                                                                                               bis Dame gefunden, die man weiterstellen kann                   Dame ein Feld weiter                                  ) --> ( Acht Damen   Finden einer Lösung )                                                                                            : ACHT_DAMEN                                                      1 pos!                                                          2                                                               begin                                                             moeglich?                                                        if 1+                                                           else reihe+                                                     then                                                           dup 9 =                                                        until                                                           drop ;                                                                                                                                                                                                                                                  -->  ( Acht Damen   Finden einer Lösung                                                                                                ACHT_DAMEN     Aufruf: Reihe der A-Dame ---                                    A-Dame laut Eingabe setzen                                      Setzen der B-Dame                                begin                                                                ist die Stellung der aktuellen Dame möglich ?                   ja: nächste Dame nehmen                                         nein: Dame auf nächste Reihe stellen                                                                                                                                                       until   Linie = 9 d.h. Feld zu Ende                             Stack säubern                                                                                                                                                                                                                                          ) -->  ( Acht Damen           Ausgabe aller Lösungen )                                                                                 : NAECHSTE_LOESUNG   8 reihe+ drop 1 pos@ acht_damen ;                                                                            variable LOESUNGEN  0 ,                                                                                                       : ALLE_LOESUNGEN                                                  0 loesungen !                                                   init    cr                                                      1 acht_damen                                                    begin   1 pos@ 0 pos@ - 0>=   while                               loesungen @ 1+ dup 3 .r loesungen ! 3 spaces                    printpos                                                        1 pos@  0 pos!                                                  naechste_loesung                                              repeat ;                                                      ( Acht Damen           Ausgabe aller Lösungen                                                                                    NAECHSTE_LOESUNG   Dame auf der H-Linie wird ein Feld weiter                       gesetzt, dann wird Acht_Damen aufgerufen     LOESUNGEN   enthält Anzahl der Lösungen                                                                                         ALLE_LOESUNGEN    findet alle Lösungen                              Variable Loesungen auf 0 setzen                                 Alle Damen auf erste Reihe setzen                               definierten Anfangszustand schaffen = 1te Lösung            while Reihe A-Dame >= Reihe A-Dame vorherige Lösung                Lösungsnummer hochzählen und ausgeben                           Lösung ausgeben                                                 Stellung A-Dame speichern                                       nächste Lösung suchen                                        repeat                                                  ) ;S