在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一
答案:1 悬赏:80 手机版
解决时间 2021-03-16 06:30
- 提问者网友:几叶到寒
- 2021-03-15 22:18
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一
最佳答案
- 五星知识达人网友:七十二街
- 2021-03-15 23:12
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 m<=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+1<=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.
{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 m<=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+1<=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.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯