#HDU 2553 N皇后问题 (dfs)

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43851525/article/details/92197515