Дано шахматное поле, расставить n ферзей так чтобы они не били друг друга
Категория: Delphi/Pascal
2013-04-15 14:49:31
Код для 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(′ANSWER ′,count:2,′: ′); write(′[′); for col:=0 to max do write(solution[col]:3); writeln(′]′); 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
Поделиться: