主题:求助
风神少年
[专家分:730] 发布于 2006-11-29 12:37:00
谁来说一说8皇后问题,并编一个程序
回复列表 (共11个回复)
沙发
zjsyzhong [专家分:520] 发布于 2006-11-29 12:40:00
是国际象棋里的东东吧~
[em10]
板凳
风神少年 [专家分:730] 发布于 2006-11-29 12:41:00
没错,那你讲一讲啊
3 楼
zjsyzhong [专家分:520] 发布于 2006-11-29 12:42:00
具体怎么样我也不知道的 问版主 副版主去
[em13]
4 楼
风神少年 [专家分:730] 发布于 2006-11-29 12:43:00
我晕
5 楼
zjsyzhong [专家分:520] 发布于 2006-11-29 12:43:00
我倒
[em9]
6 楼
风神少年 [专家分:730] 发布于 2006-11-29 12:44:00
不会吧,正经点
7 楼
zjsyzhong [专家分:520] 发布于 2006-11-29 12:45:00
究竟怎么样我也不知道啊?
8 楼
风神少年 [专家分:730] 发布于 2006-11-29 12:45:00
[quote]不会吧,正经点[/quote]
别说同样的话
9 楼
sss333 [专家分:340] 发布于 2006-11-29 12:52:00
大榕树
10 楼
编程黑客 [专家分:1660] 发布于 2006-11-29 22:19:00
const max=8;
var i,j:integer;
a:array[1..max] of 0..max; {放皇后数组}
b:array[2..2*max] of boolean; {/对角线标志数组}
c:array[-(max-1)..max-1] of boolean; {\对角线标志数组}
col:array[1..max] of boolean; {列标志数组}
total:integer; {统计总数}
procedure output; {输出}
var i:integer;
begin
write('No.':4,'[',total+1:2,']');
for i:=1 to max do write(a[i]:3);write(' ');
if (total+1) mod 2 =0 then writeln; inc(total);
end;
function ok(i,dep:integer):boolean; {判断第dep行第i列可放否}
begin
ok:=false;
if ( b[i+dep]=true) and ( c[dep-i]=true) {and (a[dep]=0)} and
(col[i]=true) then ok:=true
end;
procedure try(dep:integer);
var i,j:integer;
begin
for i:=1 to max do {每一行均有max种放法}
if ok(i,dep) then begin
a[dep]:=i;
b[i+dep]:=false; {/对角线已放标志}
c[dep-i]:=false; {\对角线已放标志}
col[i]:=false; {列已放标志}
if dep=max then output
else try(dep+1); {递归下一层}
a[dep]:=0; {取走皇后,回溯}
b[i+dep]:=true; {恢复标志数组}
c[dep-i]:=true;
col[i]:=true;
end;
end;
begin
for i:=1 to max do begin a[i]:=0;col[i]:=true;end;
for i:=2 to 2*max do b[i]:=true;
for i:=-(max-1) to max-1 do c[i]:=true;
total:=0;
try(1);
writeln('total:',total);
end.
我来回复