Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0
Sample Output
1 92 10
第一次写这道题还是寒假那会, 刚学dfs, 看题解看半天才写出来, 现在写轻松多了,方法和当时也不一样,这次是用的一维
思路 : 首先一共N行N列, N个皇后, 我们只需要考虑列和斜率这两个因素, 因为如果这一行有一个条件满足的话直接搜下一行,行就不作为判断条件了,所以我们用int型数组vis, 既表示了这一列是否放了皇后, 也表示他放在了第几列。比如我们判断到第 3行第 2 列的时候, 我们就要从第1行到第2行遍历, 看是否有vis【1】 = 2或者 vis【2】 = 2的情况, 再判断斜率绝对值是否为1就可以啦。
不知道咋的就是T了, 气的我直接打表。。
AC代码 :
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 10;
int n, sum, vis[maxn];
bool check (int d, int t) {
for (int i = 1; i < d; i++) {
if (vis[i] == t || abs(vis[i] - t) == abs(i - d))
return false;
}
return true;
}
void dfs(int d) {
if (d == n + 1) {
sum++;
return ;
}
for (int i = 1; i <= n; i++) {
if (check (d, i)) {
vis[d] = i;
dfs (d + 1);
vis[d] = 0;
}
}
}
int main()
{
p[1] = 1;
p[2] = 0;
p[3] = 0;
p[4] = 2;
p[5] = 10;
p[6] = 4;
p[7] = 40;
p[8] = 92;
p[9] = 352;
p[10] = 724;
while (cin >> n && n) {
cout << p[n] << endl;
}
return 0;
}