home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 05 / springer.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-04-15  |  4.3 KB  |  120 lines

  1. {---------------------------------------------------------------------------}
  2. { Einen Weg fuer den Springer ueber alle Felder eines n*n Spielbretts mit
  3.   n*n Zuegen nach folgenden Regeln suchen:
  4.     Ausgangsfeld beliebig, Bewegung gemaess Schachregeln, kein Feld darf
  5.     zweimal besucht werden!                                                 }
  6.  
  7. PROGRAM Springer_Weg;
  8.  
  9. CONST   n         =  5;              { Anzahl der Felder pro Reihe / Spalte }
  10.         n_quadrat = 25;
  11.  
  12. TYPE    index     = 1..n;
  13.         zug_nr    = 0..n_quadrat;
  14.  
  15. VAR     gefunden  : BOOLEAN;                       { Loesungsweg gefunden ? }
  16.         x0, y0    : INTEGER;             { Koordinaten der Anfangspostition }
  17.         index_set : SET OF INDEX;
  18.         add_x,                       { Addiotionstabellen der Springerzuege }
  19.         add_y     : PACKED ARRAY[1..8] OF -2..2;
  20.         brett     : PACKED ARRAY[index,index] OF zug_nr;       { Spielbrett }
  21.  
  22. {---------------------------------------------------------------------------}
  23. {              Spielbrett und Springerzuege initialisieren:                 }
  24.  
  25. PROCEDURE initalisieren;
  26.  
  27. VAR  i1, i2 : index;
  28.  
  29. BEGIN
  30.   FOR i1 := 1 TO n DO                        { Spielbrett initialisieren... }
  31.     FOR i2 := 1 TO n DO
  32.       brett[i1,i2] := 0;                     { ...alle Felder frei makieren }
  33.   index_set := [1..n];
  34.   add_x[1] := -1;  add_y[1] := +2;      { zwei nach oben, eins nach links   }
  35.   add_x[2] := -2;  add_y[2] := +1;      { eins nach oben, zwei nach links   }
  36.   add_x[3] := -2;  add_y[3] := -1;      { eins nach unten, zwei nach links  }
  37.   add_x[4] := -1;  add_y[4] := -2;      { zwei nach unten, eins nach links  }
  38.   add_x[5] := +1;  add_y[5] := -2;      { zwei nach unten, eins nach rechts }
  39.   add_x[6] := +2;  add_y[6] := -1;      { eins nach unten, zwei nach rechts }
  40.   add_x[7] := +2;  add_y[7] := +1;      { eins nach oben, zwei nach rechts  }
  41.   add_x[8] := +1;  add_y[8] := +2;      { zwei nach oben, eins nach rechts  }
  42. END;
  43.  
  44. {---------------------------------------------------------------------------}
  45. {           Brett und Belegung der einzelnen Felder anzeigen:               }
  46.  
  47. PROCEDURE brett_auslisten;
  48.  
  49. VAR  i1, i2 : index;
  50.  
  51. BEGIN
  52.   WriteLn;
  53.   FOR i2 := 1 TO n DO
  54.   BEGIN
  55.     FOR i1 := 1 TO n DO Write(brett[i1,i2]:2, ' ');
  56.     WriteLn;
  57.   END;
  58. END;
  59.  
  60. {---------------------------------------------------------------------------}
  61. {                      Problem zu loesen versuchen:                         }
  62.  
  63. PROCEDURE finde_weg (zug : zug_nr; x, y : index; VAR q : BOOLEAN);
  64.  
  65. VAR  versuch, x_neu, y_neu : INTEGER;
  66.      erfolgreich           : BOOLEAN;
  67.  
  68. BEGIN
  69.   GotoXY(21,2); WriteLn(zug); { Zugtiefe der momentanen Berechnung ausgeben }
  70.   brett_auslisten;
  71.   versuch := 0;
  72.   REPEAT
  73.     erfolgreich := FALSE;
  74.     versuch := Succ(versuch);
  75.     x_neu := x + add_x[versuch];
  76.     y_neu := y + add_y[versuch];
  77.     IF (x_neu IN index_set) AND (y_neu IN index_set) THEN  { Zug zulaessig? }
  78.     BEGIN
  79.       IF brett[x_neu,y_neu] = 0 THEN
  80.       BEGIN
  81.         brett[x_neu,y_neu] := zug;               { Feld als belegt makieren }
  82.         IF zug < n_quadrat THEN          { schon alle Felder "besprungen" ? }
  83.           BEGIN
  84.             finde_weg(Succ(zug), x_neu, y_neu, erfolgreich);
  85.             IF NOT erfolgreich THEN
  86.               brett[x_neu,y_neu] := 0;                  { Feld wieder frei! }
  87.           END
  88.         ELSE
  89.           erfolgreich := TRUE;     { alle Felder sind abgedeckt --> fertig! }
  90.       END;
  91.     END;
  92.   UNTIL erfolgreich OR (versuch = 8);
  93.   q := erfolgreich;
  94. END;
  95.  
  96. {---------------------------------------------------------------------------}
  97.  
  98. BEGIN { Springer_Weg }
  99.   initalisieren;
  100.   WriteLn;  WriteLn;
  101.   REPEAT
  102.     Write('Anfangsposition des Springers     a)  x-Koordinate : ');
  103.     ReadLn(x0);
  104.   UNTIL x0 IN index_set;
  105.   REPEAT
  106.     Write('b)  y-Koordinate : ':53);
  107.     ReadLn(y0)
  108.   UNTIL y0 IN index_set;
  109.   ClrScr;                                             { Bildschirm loeschen }
  110.   GotoXY(1,2);  Write('aktuelle Zugtiefe : ');
  111.   brett[x0,y0] := 1;
  112.   finde_weg(2, x0, y0, gefunden);
  113.   GotoXY(1,16);
  114.   IF gefunden THEN
  115.     brett_auslisten
  116.   ELSE
  117.     Write('Kein Loesungsweg gefunden ! ');
  118.   REPEAT UNTIL KeyPressed;                    { auf irgendeine Taste warten }
  119. END.
  120.