(**********************************************************************

    :Program.    Dame.mod
    :Contents.   Lösung des 8-Damen Problems
    :Author.     Markus Uhlendahl
    :Address.    Vorm Burgtor 16, 4408 Dülmen
    :Phone.      02594/81540
    :Copyright.  Public Domain
    :Language.   Modula-2
    :Translator. M2Amiga AMSoft V3.3d

**********************************************************************)
PROGRAM Damen;




CONST n = 8;


TYPE vektorTyp = ARRAY[0..n] OF INTEGER;


VAR v : vektorTyp;
    i : INTEGER;
    l : INTEGER;


PROCEDURE Ausgabe (v : vektorTyp);

  VAR i : INTEGER;

  BEGIN
    FOR i:=1 TO n DO BEGIN
      Write ('(');Write (v[i]:2);Write ('|');
      Write (i:2);Write (')');
    END;
    WriteLn;
  END;


FUNCTION akzeptiert (v : vektorTyp) : BOOLEAN;

  VAR a : BOOLEAN;
      i : INTEGER;

  BEGIN
    a:=TRUE;
    i:=1;
    WHILE (i<v[0]) AND (a) DO BEGIN
      IF v[v[0]]=v[i] THEN BEGIN
        a:=FALSE;
      END;
      IF v[v[0]]+v[0]=v[i]+i THEN BEGIN
        a:=FALSE;
      END;
      IF v[v[0]]-v[0]=v[i]-i THEN BEGIN
        a:=FALSE;
      END;
      i:=i+1;
    END;
    akzeptiert:= (a); EXIT;
  END;


PROCEDURE versuche (v : vektorTyp);

  VAR i : INTEGER;

  BEGIN
    v[0]:=v[0]+1;
    FOR i:=1 TO n DO BEGIN
      v[v[0]]:=i;
      IF akzeptiert (v) THEN BEGIN
        IF v[0]=n THEN BEGIN
          Ausgabe (v);
          l:=l+1;
        END ELSE BEGIN
          versuche (v);
        END;
      END;
    END;
  END;


BEGIN
  l:=0;
  FOR i:=0 TO n DO BEGIN
    v[i]:=0;
  END;
  versuche (v);
  Write ('Anzahl der Lösungen:');Write (l:6);WriteLn;
END.
