国际象棋棋盘上摆14个互不攻击的象,有几种摆法

2020-10-16 教育 175阅读
pascal n皇后程序,供参考。
{n皇后问题,递归解法,优化解法}
const n=10; {n为皇后个数,在程序中为常数,编译前请调整}
var
b:array[1..n,1..n] of boolean;
i,j:integer;
sum:longint;
procedure next(m:integer); {m表示列,从第一列开始找,直到第n列}
label 999;
var
i:integer;
p,q:integer; {循环变量,分别标识行、列}
find:boolean;
begin {i表示棋盘的行}
if mlt;=n then
for i:=1 to n do begin
{b[i,m]--以此为基点计算}
find:=false;
for q:=1 to m-1 do if b[i,q] then begin find:=true; goto 999; end; {检查行}
p:=i; q:=m;
while (p-1;=1)and(q-1;=1) do begin {检查左上方}
dec(p);
dec(q);
if b[p,q] then begin find:=true; goto 999; end;
end;
p:=i; q:=m;
while (p+1lt;=n)and(q-1;=1) do begin {检查左下方}
inc(p);
dec(q);
if b[p,q] then begin find:=true; goto 999; end;
end;
if not find then begin
b[i,m]:=true;
next(m+1); {递归}
b[i,m]:=false; {回溯}
end;
999:
end;
if m;n then begin
for p:=1 to n do begin
for q:=1 to n do if b[p,q] then write(q:3);
end;
writeln;
inc(sum);
end
end;
begin
for i:=1 to n do for j:=1 to n do b[i,j]:=false;
sum:=0;
next(1);
if sum;0 then writeln(;sum=;,sum) else writeln(;no solute;);
end.
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com