算法二十:n皇后

描述

n皇后问题:一个n×n的棋盘,在棋盘上摆n个皇后,满足任意两个皇后不能在同一行、同一列或同一斜线上的方案有多少种?

输入

第一行包含一个整数n。

输出

输出一个整数,表示方案数。

样例1输入

4

样例1输出

2

 

提示

[考察剪枝水平,剪枝剪得好(二进制剪枝)的才能过第10个测试点。]

 

一. 伪代码

算法二十:n皇后_第1张图片

 

二. 具体实现

#include
using namespace std;
// ================= 代码实现开始 =================
//ans:总答案
//allOne:用于二进制&的全1数
int ans, allOne;
//搜索(用二进制来优化)
//pos:其二进制上的某个位置的1表示当前所在行的相应的位置(列)已经放了一个皇后
//left:其二进制上的某个位置的1表示当前所在行的相应的位置(是由于右对角线上已经有皇后),不能放置皇后
//right:其二进制上的某个位置的1表示当前所在行的相应的位置(是由于左对角线上已经优皇后),不能放置皇后
void dfs(int pos,int left, int right){
    if(pos == allOne){//当且仅当每一列都放了一个皇后,那么整个棋盘已经放了n个合法皇后,故要终止
        ++ans;
        return;
    }
    for(int t = allOne & (~(pos | left | right)); t>0;){//t代表可以放的集合对应的二进制数
        int p = t & -t;//low bit: 二进制中最右边的1
        dfs(pos | p, ((left | p) << 1) & allOne, (right | p) >> 1);
        t ^= p;
    }
}
//一个n*n的棋盘,在棋盘上摆n个皇后,求满足任意两个皇后不能在同一行,同一列或同一斜线上的方案数
//n:上述n
//返回值:方案数
int getAnswer(int n){
    ans = 0;
    allOne = (1 << n) - 1;
    dfs(0, 0, 0);
    return ans;
}
// ================= 代码实现结束 =================
 

你可能感兴趣的:(Algorithm)