目前最快的N皇后问题算法!!!

云物数智 云物数智 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近老师布置了一道算法题目--N皇后问题。这个算法在本科时已经做过,现在的要求是尽可能的提高算法的执行效率。如果采用传统的办法,用3个数组来记录列、主对角线和次对角线的方式,虽然优化过语句,并且使用对称原则来减少一半的运算时间,但在1.66Ghz的机器上计算16皇后仍需要100多秒。
有的同学使用多线程方式来改进了算法,有效利用了服务器的多个CPU同时计算,好像在4CPU机器上用了17秒。但我觉得这并没有体现出算法的高效。
昨天在google上有幸找到了一个难得一见的算法,在1.66Ghz的机器上计算16皇后才用了35秒,是我目前见到的最快的皇后问题算法了。简单的看了一下算法原理,它有别于传统的数组判断模式,而是采用了位运算。我也跟踪了几个变量的位结构变化情况,但是直到今天仍没能理解作者对该算法的设计思想和算法原理。
因此期望CSDN中的算法高手不吝赐教,能对这个算法做个注释,并描述一下算法原理,在下感激不仅!

-----------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

long sum = 0, upperlim = 1;

void test(long row, long ld, long rd)
{

if (row != upperlim)
{
long pos = upperlim & ~(row | ld | rd);
while (pos)
{
long p = pos & -pos;

pos -= p;
test(row + p, (ld + p) << 1, (rd + p) >> 1);
}
} else
sum++;
}

int main(int argc, char *argv[])
{
time_t tm;
int n = 16;

if (argc != 1)
n = atoi(argv[1]);
tm = time(0);
if ((n < 1) || (n > 32))
{
printf(" 只能计算1-32之间\n");
exit(-1);
}
printf("%d 皇后\n", n);
upperlim = (upperlim << n) - 1;

test(0, 0, 0);
printf("共有%ld种排列, 计算时间%d秒 \n", sum, (int) (time(0) - tm));
}
-------------------------------
...全文

相关推荐

n皇后问题的三种算法——比较它们的效率

n皇后问题的三种算法,n^n穷举,n!穷举,回溯法,比较它们的效率

ligangcomeon

用栈求解n皇后问题 ,经典的回溯算法问题

n 皇后问题是一道经典的回溯算法问题,其目标是在一个 � × � n×n 的棋盘上放置 � n 个皇后,使得任意两个皇后都不能在同一行、同一列或同一斜线上。 栈可以用来辅助实现回溯算法,本质上就是手动维护了递归过程中系统默认维护的函数调用栈。下面给出使用栈求解 n 皇后问题的思路: 定义一个栈,用于存储已摆放皇后的位置信息。 初始将第一个皇后放到第一行第一列,入栈。 重复以下操作,直到栈为空: 取出栈顶元素,表示当前正在处理的行。 在该行从左到右依次尝试放置皇后,并检查可不可以。 如果找到一个可行的位置,则将该位置入栈,并转到下一行(即当前行数 + 1 +1)。 如果找不到可行的位置,弹出栈顶元素重新开始循环。 当栈的长度等于 � n 时,表示找到了一组可行解,输出解法。

java入门选手

八皇后问题并行算法及源代码(附N皇后)

八皇后问题并行算法及源代码(附N皇后)八皇后问题并行算法及源代码(附N皇后)八皇后问题并行算法及源代码(附N皇后)八皇后问题并行算法及源代码(附N皇后)

roc08

n皇后问题的分支限界法算法

n皇后问题的分支限界法算法,用c++实现。

wxucu

N皇后问题回溯算法

这是一个N皇后问题的回溯算法改进版,c语言版,对于学习算法设计的同学可能会用到

我是程序猿135
评论 135
收藏 已收藏
分享
返回顶部
云物数智
C语言 70,039 成员 243,237 内容