1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
(**********************************************************************)
(*
** ARIBAS code for the n queens problem
** author: Otto Forster <forster@mathematik.uni-muenchen.de>
** date: 99-04-30
**
** Example calls:
** ==> queens(9).
** ==> queensrand(20).
*)
(*--------------------------------------------------------------------*)
(*
** n-Damenproblem: n Damen sind auf einem n-mal-n-Schachbrett so
** zu plazieren, dass sie sich nicht gegenseitig bedrohen.
** Aufruf: queens(n).
** Dabei ist n die Groesse des Brettes
** (z.B. n = 8; fuer n > 10 dauert die vollstaendige Loesung sehr lange)
** Die Loesungen werden als Vektoren (a1,a2,...,an) ausgegeben.
** Dieser Vektor bezeichnet die Stellung, in der in der i-ten Zeile
** eine Dame auf der ai-ten Spalte steht
*)
(*--------------------------------------------------------------------*)
var
NbSol: integer;
end;
function queens(n: integer): integer;
external
NbSol: integer;
var
i: integer;
brett, rest: array[n];
begin
NbSol := 0;
for i := 0 to n-1 do
rest[i] := i+1;
end;
queenshilf(brett,0,rest,n);
writeln("number of solutions:");
return NbSol;
end.
(*--------------------------------------------------------------------*)
function queenshilf(brett: array; n: integer; rest: array; m: integer)
external
NbSol: integer;
var
i, j, x: integer;
begin
if m = 0 then
inc(NbSol);
writeln(NbSol:4,": ",brett);
else
for i := 0 to m-1 do
x := rest[i];
if freediag(x,brett,n) then
brett[n] := x;
for j := i+1 to m-1 do
rest[j-1] := rest[j];
end;
queenshilf(brett,n+1,rest,m-1);
for j := m-1 to i+1 by -1 do
rest[j] := rest[j-1];
end;
rest[i] := x;
end;
end;
end;
end.
(*------------------------------------------------------------------*)
function freediag(x: integer; brett: array; n: integer): boolean;
var
i: integer;
begin
for i := 0 to n-1 do
if abs(x - brett[i]) = n-i then
return false;
end;
end;
return true;
end.
(*------------------------------------------------------------------*)
(*
** randomized version of queens
** example call: queensrand(17).
*)
function queensrand(n);
var
i: integer;
brett, rest: array[n];
begin
rest := random_perm(n);
writeln(n," queens problem; ... thinking ...");
queenshilf1(brett,0,rest,n);
return;
end;
(*------------------------------------------------------------------*)
function random_perm(n: integer): array;
var
perm: array[n];
i, x, temp: integer;
begin
for i := 0 to n-1 do
perm[i] := i+1;
end;
for i := 0 to n-1 do
x := random(n-i);
temp := perm[i+x];
perm[i+x] := perm[i];
perm[i] := temp;
end;
return perm;
end;
(*------------------------------------------------------------------*)
function queenshilf1(brett: array; n: integer;
rest: array; m: integer): integer;
var
i, j, x, res: integer;
begin
if m = 0 then
display_board(brett);
return 1;
else
for i := 0 to m-1 do
x := rest[i];
if freediag(x,brett,n) then
brett[n] := x;
for j := i+1 to m-1 do
rest[j-1] := rest[j];
end;
res := queenshilf1(brett,n+1,rest,m-1);
if res > 0 then return 1; end;
for j := m-1 to i+1 by -1 do
rest[j] := rest[j-1];
end;
rest[i] := x;
end;
end;
end;
return 0;
end.
(*------------------------------------------------------------------*)
function display_board(brett: array);
var
i, n: integer;
begin
n := length(brett);
for i := 0 to n-1 do
display_row(brett[i],n);
end;
end;
(*------------------------------------------------------------------*)
function display_row(k,n)
var
i: integer;
begin
write(" ");
for i := 1 to k-1 do
write(" .");
end;
write(" D");
for i := k+1 to n do
write(" .");
end;
writeln();
end;
(*------------------------------------------------------------------*)
|