位运算搜索之N皇后

来源:互联网 发布:java轻量级javaee开发 编辑:程序博客网 时间:2024/05/16 05:41
#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,求出有多少种合法的放置方法。*/
原创粉丝点击