题目描述
在一个n行n列的国际象棋棋盘上摆放n个皇后,使皇后之间不能互相攻击,问有多少种摆法。皇后数不超过12。
输入
输入皇后个数n,遇到文件末尾结束。
输出
在一行输出有多少种摆法。
样例输入
7
8
样例输出
40
92
#include <iostream>
using namespace std;
int N, cnt, vis[3][24] = { 0 };
void dfs(int now) {
if (now == N)
cnt++;
else
for (int i = 0; i < N; ++i)
if (!vis[0][i] && !vis[1][now + i] && !vis[2][now - i + N]) { //行、列、对角线都未被占用
vis[0][i] = vis[1][now + i] = vis[2][now - i + N] = 1; //占用行、列、对角线
dfs(now + 1);
vis[0][i] = vis[1][now + i] = vis[2][now - i + N] = 0; //回溯
}
}
int main() {
while (cin >> N) {
cnt = 0;
dfs(0);
cout << cnt << endl;
}
return 0;
}