Перечислить все способы расстановки 8-ми ферзей на шахматной доске 8 на 8, при которых они не бьют друг друга

code: #pascal
  1. program Queens;
  2.  const N=8;
  3.  type Index=1..N;
  4.  Rasstanovka=array [Index] of 0..N;
  5.  var X:Rasstanovka;
  6.  Count:word;
  7.  function P(var X:Rasstanovka;k,y:Index):boolean;
  8.  var i:Index;
  9.  begin
  10.   i:=1;
  11.   while (i<k)and(y<>X[i])and(abs(k-i)<>abs(y-X[i])) do inc(i);
  12.   P:=i=k
  13.  end;
  14.  procedure Backtracking(k:Index);
  15.  var i,y:Index;
  16.  begin
  17.   for y:=1 to N do
  18.   if P(X,k,y) then
  19.   begin
  20.    X[k]:=y;
  21.    if k=N then
  22.    begin
  23.     for i:=1 to N do write(X[i]);writeln;inc(Count)
  24.    end;
  25.    Backtracking(k+1)
  26.   end
  27.  end;
  28.  begin
  29.   Count:=0;
  30.   writeln('Расстановки ',N,' ферзей:');
  31.   Backtracking(1);
  32.   writeln('Всего ',Count,' расстановок')
  33.  end.
Поделиться:

Похожие статьи: