#include <cstdio>
#include <cstdlib>
#include <ctime>
long sum = 0, lim;
void test(long row, long ld, long rd){
if (row != lim){
long pos = lim & ~(row | ld | rd);//可以放的位置
while (pos){//枚举每个位置
long p = pos & -pos;
pos -= p;
test(row | p, (ld | p) << 1, (rd | p) >> 1);//斜边的影响在换行后会移动
}
}
else sum++;
}
int main(){
time_t tm;
int n;
printf(" 需要计算的皇后数量\n");
scanf("%d", &n);
tm = time(0);
if ((n < 1) || (n > 32)){
printf(" 只能计算1-32之间\n");
exit(-1);
}
printf("%d 皇后\n", n);
lim = (1 << n) - 1;
test(0, 0, 0);
printf("共有%ld种排列, 计算时间%d秒 \n", sum, (int) (time(0) - tm));
}
/*
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
*/
位运算搜索之N皇后
最新推荐文章于 2024-08-09 17:46:52 发布