主题:加分帖~
zhaoren
[专家分:420] 发布于 2005-10-07 12:39:00
8皇后问题:
在8*8的国际象棋盘上,摆8个皇后,要使它们互相吃不到~[em18][em18]
各位大虾帮个忙,我是新手~~
回复列表 (共9个回复)
沙发
fxzxg [专家分:430] 发布于 2005-10-07 13:49:00
program tt;
var a:array [1..8] of integer;
b,c,d:array [-7..16] of integer;
t,i,j,k:integer;
procedure print;
begin
t:=t+1;
write(t,' ');
for k:=1 to 8 do write(a[k],' ');
writeln;
end;
procedure try(i:integer);
var j:integer;
begin
for j:=1 to 8 do
if (b[j]=0) and (c[i+j]=0) and (d[i-j]=0) then
begin
a[i]:=j;
b[j]:=1;
c[i+j]:=1;
d[i-j]:=1;
if i<8 then try(i+1)
else print;
b[j]:=0;
c[i+j]:=0;
d[i-j]:=0;
end;
end;
begin
for k:=-7 to 16 do
begin
b[k]:=0;
c[k]:=0;
d[k]:=0;
end;
try(1);
end.
板凳
zhsas [专家分:1680] 发布于 2005-10-07 16:09:00
这个我回过两次了.你可以用搜索功能找的.
3 楼
zhaoren [专家分:420] 发布于 2005-11-12 17:52:00
谢谢了
4 楼
lmj9201 [专家分:1400] 发布于 2005-11-13 20:24:00
program eightqueens;
var
x:array[1..8] of integer;
a,b,c:array[-7..16] of boolean;
i:integer;
procedure print;
var k:integer;
begin
for k:=1 to 8 do write(x[k]:4);
writeln;
end;
procedure try(i:integer);
var j:integer;
begin
for j:=1 to 8 do
if a[j] and b[i+j] and c[i-j]
then begin
x[i]:=j;
a[j]:=false;
b[i+j]:=false;
c[i-j]:=false;
if i<8 then try(i+1)
else print;
a[j]:=true;
b[i+j]:=true;
c[i-j]:=true
end
end;
begin
for i:=-7 to 16 do
begin
a[i]:=true;
b[i]:=true;
c[i]:=true
end;
try(1);
end.
这个更简单。
5 楼
无敌傻仔 [专家分:210] 发布于 2005-11-14 16:41:00
可以用搜索。
6 楼
小乖乖 [专家分:290] 发布于 2005-11-14 17:29:00
搜索呀!!~~`
7 楼
济公二世 [专家分:200] 发布于 2006-08-14 15:06:00
我用搜索搜过. 你也试下
8 楼
南飞的大雁 [专家分:50] 发布于 2007-10-29 16:12:00
用穷举搜索即可.不过效率较低.也可以用回溯搜索,只不过编起来较慢.自己选择用哪一种.
[fly]加点分![/fly]
9 楼
morethan [专家分:10] 发布于 2007-10-29 16:35:00
八皇后问题很经典,有不少现成的代码可用,你可以借鉴呀,当然自己能琢磨出来那就更好了。
我来回复