位运算搜索之N皇后

xiaoxiao2021-02-28  161

#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,求出有多少种合法的放置方法。 */
转载请注明原文地址: https://www.6miu.com/read-29792.html

最新回复(0)