home *** CD-ROM | disk | FTP | other *** search
- {---------------------------------------------------------------------------}
- { Auf einem normalen 8*8 Schachbrett sieben weitere Damen positionieren,
- nach dem die erste auf ein beliebiges Feld gesetzt wurde. Dabei darf
- keine Dame von einer anderen bedroht werden! }
-
- PROGRAM acht_Damen;
-
- TYPE index = 1..8;
-
- VAR x0, y0 : INTEGER; { Anfangskoordinaten der ersten Dame }
- geloest : BOOLEAN; { Loesung gefunden ? }
- ch : CHAR;
- Pos : PACKED ARRAY[index] OF INTEGER; { Position der Damen }
- zeile : PACKED ARRAY[index] OF BOOLEAN; { Zeile noch frei ? }
- r_diag : PACKED ARRAY[2..16] OF BOOLEAN; { /-Diagonale frei ? }
- l_diag : PACKED ARRAY[-7..7] OF BOOLEAN; { \-Diagonale frei ? }
-
- {---------------------------------------------------------------------------}
- { alle Diagonalen und Zeilen als frei markieren: }
-
- PROCEDURE initialisieren;
-
- VAR i : INTEGER;
-
- BEGIN
- FOR i := 1 TO 8 DO
- BEGIN
- Pos[i] := 0;
- zeile[i] := TRUE;
- END;
- FOR i := 2 TO 16 DO r_diag[i] := TRUE;
- FOR i := -7 TO 7 DO l_diag[i] := TRUE;
- END;
-
- {---------------------------------------------------------------------------}
-
- PROCEDURE loesung_ausgeben;
-
- VAR i : INTEGER;
-
- BEGIN
- FOR i := 1 TO 8 DO
- WriteLn('Dame ', i, ' : ', Chr(Ord('a')-1+i),Pos[9-i]);
- END;
-
- {---------------------------------------------------------------------------}
- { Problem loesen: }
-
- PROCEDURE suche_loesung (anz : index; VAR q : BOOLEAN);
-
- VAR versuch, spalte : INTEGER;
- erfolgreich : BOOLEAN;
-
- BEGIN
- FOR versuch := 1 TO 8 DO { freie Spalte suchen }
- IF Pos[versuch] = 0 THEN spalte := versuch;
- versuch := 0;
- REPEAT
- erfolgreich := FALSE;
- versuch := Succ(versuch);
- IF zeile[versuch] AND
- (r_diag[spalte+versuch] AND l_diag[spalte-versuch]) THEN
- BEGIN { Zeile, Spalte und Diagonalen noch unbesetzt ? }
- Pos[spalte] := versuch;
- zeile[versuch] := FALSE; { Zeile als belegt makieren }
- r_diag[spalte+versuch] := FALSE; { /-Diagonale als belegt makieren }
- l_diag[spalte-versuch] := FALSE; { \-Diagonale als belegt makieren }
- IF anz < 8 THEN
- BEGIN
- suche_loesung(Succ(anz), erfolgreich);
- IF NOT erfolgreich THEN
- BEGIN
- Pos[spalte] := 0;
- zeile[versuch] := TRUE; { Zeile wieder freigeben }
- r_diag[spalte+versuch] := TRUE; { /-Diagonale wieder freigeben }
- l_diag[spalte-versuch] := TRUE; { \-Diagonale wieder freigeben }
- END;
- END
- ELSE
- erfolgreich := TRUE;
- END;
- UNTIL erfolgreich OR (versuch = 8);
- q := erfolgreich;
- END;
-
- {---------------------------------------------------------------------------}
-
- BEGIN { acht_Damen }
- initialisieren;
- WriteLn; WriteLn;
- Write('Position der ersten Dame : ');
- REPEAT
- Read(Kbd, ch); { ein Zeichen ohne Echo von Tastatur lesen }
- IF (ch >= 'a') AND (ch <= 'h') THEN
- ch := Chr(Ord(ch)-Ord('a')+Ord('A'));
- UNTIL ch IN ['A'..'H'];
- Write(ch);
- x0 := Ord('A')+8-Ord(ch);
- REPEAT
- Read(Kbd, ch);
- UNTIL ch IN ['1'..'8'];
- WriteLn(ch);
- y0 := Succ(Ord(ch)-Ord('1'));
- Pos[x0] := y0; { Anfangsposition makieren }
- zeile[y0] := FALSE; { Zeile als belegt makieren }
- r_diag[x0+y0] := FALSE; { /-Diagonale als belegt makieren }
- l_diag[x0-y0] := FALSE; { \-Diagonale als belegt makieren }
- suche_loesung(2, geloest);
- WriteLn; WriteLn; WriteLn;
- IF geloest THEN
- loesung_ausgeben
- ELSE
- Write('Keine Loesung gefunden ! ');
- REPEAT UNTIL KeyPressed;
- END.