问题描述
使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前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.
Pixiv ID:61548898