题目描述
在一个NN的国际棋盘上,放置N个皇后,使她们相互之间不能进攻(任意两皇后不能位置同一行、同一列、同一斜线)。
因为每行只有一个皇后,我们可以用一行N个数值来表示NN棋盘上皇后位置。
结果中第i列的数值j表示棋盘上第[i,j]位置上有一个皇后。
2 4 6 1 3 5
表示棋盘上第[1,2]、[2,4]、[3,6]、[4,1]、[5,3]、[6,5]位置上有一个皇后。
输入
N(6≤N≤13)
输出
前三行为先得到的三组解,
每组解为N个数,之间用空格隔开。
最后一行为总解数
样例输入
6
样例输出
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
分析
为了减少复杂度,用一位数组代替二维数组,a[i] = j代替a[i][j];
b[15]用来记录行有没有棋子,假如b[1] == 0,则表示第一行没有棋子,放入棋子后(a[ ] = 1)就使b[1] = 1;
c[30]用来记录主对角线上是否有棋子;
d[30]用来记录副对角线上是否有棋子;
注意
记得还原,比如判断失败
if(b[a[step]] == 0)
b[a[step]] = 1;
else
{
c[p] = 0;
d[q] = 0;
continue;
}
和回溯,特别是输出之后
if(step == n)
{
if(num < 3)
show();
num++;
c[p] = 0;
d[q] = 0;
b[a[step]