深搜这种问题还是比较暴力的,显而易见,还是很水。
两种思路,一种是一行一行摆,一种是一列一列摆,两种思路差不多。
题目内容
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
题目输入
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
题目输出
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
样例输入
1
8
5
0
样例输出
1
92
10
#include<bits/stdc++.h>
using namespace std;
long long sum, n, x[21];
bool diagon(int k) {
for (int j = 1; j < k; j++)
if ((abs(k - j) == abs(x[j] - x[k])) || (x[j] == x[k]))
return false;
return true;
}
void Place(int t){
if (t > n) sum++;
else
for (int i = 1; i <= n; i++) {
x[t] = i;
if (diagon(t)) Place(t + 1);
}
}
int main() {
while(cin >> n) {
if(n == 0) {
break;
}
sum = 0;
Place(1);
cout << sum << endl;
}
}
THE END