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

Поделиться:

Выведите количество вариантов расстановки ладьи на шахматной доске, чтобы ни одна из них не угрожала другой. Размер доски 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

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