题目描述
有一个N*N的棋盘,有N个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线上至多有一个棋子,输出前三个解和解的总数。
样例输入
6
样例输出
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
思路
O(2^n)
我要严重吐槽这个题目,那个n还是我补上的。
使用多个数组记录列和对角线的情况,若皇后可在对角线上连成直线,则横纵坐标之和、之差均相等。
vard:array[1..20] of longint;a,b,c:array[-100..160] of 0..1;t,n,z:longint;
procedure try(s:longint);
vari:longint;
beginif s>n thenbeginif z<>3 thenbegininc(z);for i:=1 to n do write(d[i],' ');writeln;end;inc(t);exit;end;for i:=1 to n doif (a[i]=0)and(b[s-i]=0)and(c[s+i]=0) thenbegind[s]:=i;a[i]:=1;b[s-i]:=1;c[s+i]:=1;try(s+1);a[i]:=0;b[s-i]:=0;c[s+i]:=0;end;
end;
beginreadln(n);try(1);writeln(t);
end.