Выведите количество вариантов расстановки ладьи на шахматной доске, чтобы ни одна из них не угрожала другой

Выведите количество вариантов расстановки ладьи на шахматной доске, чтобы ни одна из них не угрожала другой. Размер доски NxN (n вводится пользователем). Предусмотрите возможность вывода и самих вариантов расстановки.

code: #pascal
uses crt;
var a:array[1..20,1..20] of byte;
    dx,dy:array[1..20] of boolean;
    j,l,n:integer;
    m:real;
function work(x,y:byte):boolean;
begin
work:=(dx[x])and(dy[y]);
end;
 
procedure hod(x,y:byte);
begin
a[x,y]:=1;dx[x]:=false;dy[y]:=false;
end;
 
procedure back(x,y:byte);
begin
a[x,y]:=0;dx[x]:=true;dy[y]:=true;
end;
 
procedure solve(x,y:byte);
var
i:byte;
begin
if y>n then
 begin
  m:=m+1;
  exit;
 end;
 
for x:=x to n do
for i:=1 to n do
if (a[x,i]=0)and(work(x,i)) then begin
hod(x,i);
solve(x+1,y+1);
back(x,i);
end;
end;
 
begin
clrscr;
write('Введите n=');
readln(n);
fillchar(dx,sizeof(dx),true);
fillchar(dy,sizeof(dy ),true);
solve(1,1);
write('Количество расстановок=',m:0:0);
readln
end.

автор: Puporev

Поделиться:

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