回 帖 发 新 帖 刷新版面

主题:???

8皇后是什么?

回复列表 (共5个回复)

沙发

在n*n的棋盘上放置n个皇后而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个或2个以上的皇后),编程求解所有的摆放方法。现设计方案避免相互接触相争。

板凳

就是回溯的思想拉

3 楼

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 楼

佩服,这题目考试上会有吗

5 楼

基本上没有

我来回复

您尚未登录,请登录后再回复。点此登录或注册