【洛谷 1219】八皇后

问题描述
使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。
样例输入
6
样例输出
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
算法讨论
比较经典的搜索题,数据也很小,直接暴搜就好了。

const
  maxn=100;
var
  a,l1,l2,d:array[-maxn..maxn] of longint;
  i,j,n,s:longint;

procedure dfs(dep:longint);
var
  i,j:longint;
begin
  if dep>n
    then begin
           if (a[dep-1]<>0) and (s<3)
             then begin
                    for i:=1 to n do
                      write(a[i],' ');
                    writeln;
                  end;
           if a[dep-1]<>0
             then inc(s);
           exit
         end;
  for i:=1 to n do
    if (d[i]=0) and (l1[dep-i]=0) and (l2[dep+i]=0)
      then begin
             d[i]:=1;
             l1[dep-i]:=1;
             l2[dep+i]:=1;
             a[dep]:=i;
             dfs(dep+1);
             d[i]:=0;
             l1[dep-i]:=0;
             l2[dep+i]:=0;
             a[dep]:=0
           end;
end;

begin
  read(n);
  dfs(1);
  write(s)
end.

【洛谷 1219】八皇后_第1张图片
Pixiv ID:61548898

你可能感兴趣的:(搜索)