program damy;

{Reseni problemu osmi dam na sachovnici}
{Prevzato od Ing. Viriuse}

uses crt;

const maxdam = 10;

type PocetDam = 1..maxdam+1;

var X:    array [PocetDam] of integer;
    n:    integer;
    PocRe:integer;

procedure nuluj;
var i: integer;
begin
    for i := 1 to maxdam do X[i] := 0;
end;

function Bezpecne(k,m: integer): boolean;
var l:     integer;  {je dana pozice bezpecna}
    b:     boolean;
begin {k: radek, m: sloupec}
  b := true;
  if m>1 then begin
      l := 1;
      while b and (l < m) do begin
        b := (X[l]<>k) and           {na stejnem radku}
             ((X[l]+l)<> (m+k)) and  {stejna vedl. diagonala}
             ((X[l]-l) <> (k-m));    {stejna hl. diagonala}
        if not b then break;
        inc(l);
      end;
  end;
  Bezpecne := b;
end;

procedure vypis;
var i: PocetDam;
begin
  write('(');
  for i := 1 to n do write(X[i],',');
  writeln(')');
end;

{vlastni reseni - rekurzivne + backtracking}
procedure vyres(m: integer);
var k: PocetDam;
begin
  if m > n then begin
    vypis;
    inc(pocre);
   end else
   for k := 1 to n do begin
      if Bezpecne(k,m) then begin
        X[m] := k;
        vyres(m+1);
      end
   end;
   X[m] := 0;
end;

begin
    repeat
    clrscr;
    write('Pocet dam (cislo <=0 znamena konec): ');
    readln(n);
    if n <= 0 then break;
    if n>maxdam then begin
      writeln('pocet dam nesmi presahnout ', maxdam);
      writeln('stiskni klavesu...');
      readkey;
      continue;
    end;
    PocRe := 0;
    vyres(1);
    writeln('uloha ma ', PocRe, ' reseni');
    writeln('stiskni klavesu...');
    readkey;
   until false;
end.

