主题:???
sss333
[专家分:340] 发布于 2006-11-25 17:09:00
8皇后是什么?
回复列表 (共5个回复)
沙发
bigchen [专家分:1940] 发布于 2006-11-25 17:24:00
在n*n的棋盘上放置n个皇后而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个或2个以上的皇后),编程求解所有的摆放方法。现设计方案避免相互接触相争。
板凳
bigchen [专家分:1940] 发布于 2006-11-25 17:24:00
就是回溯的思想拉
3 楼
bigchen [专家分:1940] 发布于 2006-11-25 17:25:00
var l ,k,n,j:integer; x:array[1..100]of integer;
function place(k:integer):boolean;{k为行号也就是第k个皇后,函数值为真时表示能放}
var i:integer;
begin
i:=1;
while i<k do
begin if (x[i]=x[k]) or (abs(x[i]-x[k])=abs(i-k))then{第k个皇后与第i个皇后同一列}
begin place:=false; exit end;{或在同一斜对角线上}
i:=i+1;
end;
place:=true;
end;
begin
write('n=');readln(n);{输入皇后的个数}
l:=0;x[1]:=0;k:=1;{初始化:解的个数l,第一皇后所在列为0,从第一个皇后开始}
while k>0 do{当回溯到没有皇后时停止}
begin
x[k]:=x[k]+1;{穷举第k皇后的位置}
while (x[k]<=n)and(not place(k))do x[k]:=x[k]+1;{不符合条件,穷举下一个位置}
if x[k] <=n then
if k=n then begin{当皇后所穷举的列号没有超出n,并且正好是最后一个皇后}
l:=l+1;{可安置的位置找到}
write('no',l,': ');{输出栈的内容,也就是输出每个皇后所在列号}
for j:=1 to n do write(x[j],' ');
writeln;
end
else begin{当皇后所穷举的列号没有超出n,但还不是最后一个后}
inc(k);x[k]:=0;{找下一个皇后,并初始化所在列号(位置)为0}
end
else k:=k-1;{当皇后所穷举的列号超出n,回溯到前一个皇后}
end;
end.
4 楼
风神少年 [专家分:730] 发布于 2006-12-08 16:08:00
佩服,这题目考试上会有吗
5 楼
sss333 [专家分:340] 发布于 2006-12-08 16:53:00
基本上没有
我来回复