home *** CD-ROM | disk | FTP | other *** search
- {---------------------------------------------------------------------------}
- { Einen Weg fuer den Springer ueber alle Felder eines n*n Spielbretts mit
- n*n Zuegen nach folgenden Regeln suchen:
- Ausgangsfeld beliebig, Bewegung gemaess Schachregeln, kein Feld darf
- zweimal besucht werden! }
-
- PROGRAM Springer_Weg;
-
- CONST n = 5; { Anzahl der Felder pro Reihe / Spalte }
- n_quadrat = 25;
-
- TYPE index = 1..n;
- zug_nr = 0..n_quadrat;
-
- VAR gefunden : BOOLEAN; { Loesungsweg gefunden ? }
- x0, y0 : INTEGER; { Koordinaten der Anfangspostition }
- index_set : SET OF INDEX;
- add_x, { Addiotionstabellen der Springerzuege }
- add_y : PACKED ARRAY[1..8] OF -2..2;
- brett : PACKED ARRAY[index,index] OF zug_nr; { Spielbrett }
-
- {---------------------------------------------------------------------------}
- { Spielbrett und Springerzuege initialisieren: }
-
- PROCEDURE initalisieren;
-
- VAR i1, i2 : index;
-
- BEGIN
- FOR i1 := 1 TO n DO { Spielbrett initialisieren... }
- FOR i2 := 1 TO n DO
- brett[i1,i2] := 0; { ...alle Felder frei makieren }
- index_set := [1..n];
- add_x[1] := -1; add_y[1] := +2; { zwei nach oben, eins nach links }
- add_x[2] := -2; add_y[2] := +1; { eins nach oben, zwei nach links }
- add_x[3] := -2; add_y[3] := -1; { eins nach unten, zwei nach links }
- add_x[4] := -1; add_y[4] := -2; { zwei nach unten, eins nach links }
- add_x[5] := +1; add_y[5] := -2; { zwei nach unten, eins nach rechts }
- add_x[6] := +2; add_y[6] := -1; { eins nach unten, zwei nach rechts }
- add_x[7] := +2; add_y[7] := +1; { eins nach oben, zwei nach rechts }
- add_x[8] := +1; add_y[8] := +2; { zwei nach oben, eins nach rechts }
- END;
-
- {---------------------------------------------------------------------------}
- { Brett und Belegung der einzelnen Felder anzeigen: }
-
- PROCEDURE brett_auslisten;
-
- VAR i1, i2 : index;
-
- BEGIN
- WriteLn;
- FOR i2 := 1 TO n DO
- BEGIN
- FOR i1 := 1 TO n DO Write(brett[i1,i2]:2, ' ');
- WriteLn;
- END;
- END;
-
- {---------------------------------------------------------------------------}
- { Problem zu loesen versuchen: }
-
- PROCEDURE finde_weg (zug : zug_nr; x, y : index; VAR q : BOOLEAN);
-
- VAR versuch, x_neu, y_neu : INTEGER;
- erfolgreich : BOOLEAN;
-
- BEGIN
- GotoXY(21,2); WriteLn(zug); { Zugtiefe der momentanen Berechnung ausgeben }
- brett_auslisten;
- versuch := 0;
- REPEAT
- erfolgreich := FALSE;
- versuch := Succ(versuch);
- x_neu := x + add_x[versuch];
- y_neu := y + add_y[versuch];
- IF (x_neu IN index_set) AND (y_neu IN index_set) THEN { Zug zulaessig? }
- BEGIN
- IF brett[x_neu,y_neu] = 0 THEN
- BEGIN
- brett[x_neu,y_neu] := zug; { Feld als belegt makieren }
- IF zug < n_quadrat THEN { schon alle Felder "besprungen" ? }
- BEGIN
- finde_weg(Succ(zug), x_neu, y_neu, erfolgreich);
- IF NOT erfolgreich THEN
- brett[x_neu,y_neu] := 0; { Feld wieder frei! }
- END
- ELSE
- erfolgreich := TRUE; { alle Felder sind abgedeckt --> fertig! }
- END;
- END;
- UNTIL erfolgreich OR (versuch = 8);
- q := erfolgreich;
- END;
-
- {---------------------------------------------------------------------------}
-
- BEGIN { Springer_Weg }
- initalisieren;
- WriteLn; WriteLn;
- REPEAT
- Write('Anfangsposition des Springers a) x-Koordinate : ');
- ReadLn(x0);
- UNTIL x0 IN index_set;
- REPEAT
- Write('b) y-Koordinate : ':53);
- ReadLn(y0)
- UNTIL y0 IN index_set;
- ClrScr; { Bildschirm loeschen }
- GotoXY(1,2); Write('aktuelle Zugtiefe : ');
- brett[x0,y0] := 1;
- finde_weg(2, x0, y0, gefunden);
- GotoXY(1,16);
- IF gefunden THEN
- brett_auslisten
- ELSE
- Write('Kein Loesungsweg gefunden ! ');
- REPEAT UNTIL KeyPressed; { auf irgendeine Taste warten }
- END.