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

Код для 8 ферзей:

code: #delphi
program eight_queens; 
{$APPTYPE CONSOLE} 
const 
     max=7; 
     m=2*max; 
type 
    vector=array[0..max]of word; 
var 
solution:vector;  //содержит номер занятой диагонали 
Q_row:array[0..max]of boolean; //занятая горизонталь  
Q_up_diag:array[-max..max]of boolean;//занятая вертикаль 
Q_down_diag:array[0..m]of boolean;//занятая диагональ 
done:boolean;// 
row,col,diag:integer;// 
total,count:word; 
 
procedure remove_queen;//удаление ферзя("обнуление" флаговых массивов) 
begin 
Q_row[row]:=false; 
Q_down_diag[col+row]:=false; 
Q_up_diag[col-row]:=false; 
end; 
 
procedure backtrack;// cобственно, перебор 
begin 
dec(col); 
row:=solution[col]; 
while (row=max)and(col>0)do 
begin 
remove_queen; 
dec(col); 
row:=solution[col]; 
end; 
if row<max then begin remove_queen; 
inc(row); 
end else done:=true; 
end; 
 
procedure print; 
begin 
write(&#8242;ANSWER &#8242;,count:2,&#8242;: &#8242;); 
write(&#8242;[&#8242;); 
for col:=0 to max do 
write(solution[col]:3); 
writeln(&#8242;]&#8242;); 
end; 
 
begin 
total:=0; 
count:=0; 
done:=false; 
for row:=0 to max do 
Q_row[row]:=false; 
for diag:=-max to max do 
Q_up_diag[diag]:=false; 
for diag:=0 to m do 
Q_down_diag[diag]:=false; 
row:=0; 
col:=0; 
 
repeat 
if Q_row[row]or Q_down_diag[col+row]or Q_up_diag[col-row] then 
if row=max then backtrack else inc(row) 
else 
begin 
solution[col]:=row; 
Q_row[row]:=true; 
Q_down_diag[col+row]:=true; 
Q_up_diag[col-row]:=true; 
if col=max then 
begin 
inc(total); 
inc(count); 
print; 
remove_queen; 
backtrack; 
end 
else 
begin 
inc(col); 
row:=0; 
end; 
end; 
until done; 
writeln; 
writeln(total);// количество решений 
readln; 
end. 

автор: mik-a-el

Поделиться:

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