首先,要知道一个矩阵的知识
(左上向右下)对角线上的元素,行数减列数的值相等(主对角线的话等于0)
(右上向左下)对角线上的元素,行数加列数的值相等。
所以,在n皇后问题中,我们要通过这一性质,判断对角线上是否已经有皇后了。
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
打表
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cmath>
using namespace std;
int v1[20], v2[20], v3[20];
int n, tot;
void dfs(int x)
{
int i;
if (x == n + 1)
{
tot++;
return;
}
else
for (i = 1;i <= n;i++)
{
if (!v1[i] && !v2[x + i] && !v3[n + x - i])//判断该列、两条对角线的情况
{
v1[i] = v2[x + i] = v3[n + x - i] = 1;
dfs(x+1);//不能是x++或++x,因为在这层dfs中x的值表示行数不能变
v1[i] = v2[x + i] = v3[n + x - i] = 0;
}
}
}
int main(void)
{
int i, aa[20];
for (i = 1;i <= 10;i++)//打表,避免超时
{
tot=0;
memset(v1, 0, sizeof(v1));
memset(v2, 0, sizeof(v2));
memset(v3, 0, sizeof(v3));
n = i;
dfs(1);
aa[n] = tot;
}
while (cin >> n && n)
{
cout << aa[n] << endl;
}
return 0;
}