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

IceCraft 2006-04-24 01:20:14
最近老师布置了一道算法题目--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));
}
-------------------------------
...全文
24141 2 收藏 135
写回复
135 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lzjyf 2010-06-05
星辰拜师行么··
回复
nankezhishi 2006-10-09
回溯永远是最慢的.

启发式算法,如遗传算法\局部搜索.

1000后问题 数秒解决.

当然,在下不会.
回复
gezichong 2006-08-28
回复
xmhl 2006-06-20
mark
回复
ayw215 2006-06-19
强人好多啊
回复
templarzq 2006-06-19
mark
回复
wupei 2006-06-19
upup
回复
tanlerstar 2006-06-13
哎!你们太狠了!!
学习学习!
回复
POPO_POPO 2006-06-11
随时关注此帖
回复
2006-06-11
学习...
回复
heihei2004 2006-06-11
强,mark
回复
sunbird69 2006-06-11
mark
回复
mgdcs 2006-06-11
输入20的话,时间很长啊
回复
SamuelKevin 2006-06-11
shoucang
回复
transcendself 2006-06-06
good
回复
daseny 2006-05-27
mark
一到周末心就飞了,等等再看吧。
呵呵,也许是昨天被几个线程折磨惨了……
回复
Cybergate 2006-05-27
太优美了,我当时也写了个位运算的,但远远没这么精炼啊。
回复
shellyyee 2006-05-27
长见识了....只是留名学习...
回复
gengjindong 2006-05-27
C语言并不难。
只不过是有点烦。
如何能学好数据结构那就要看自己的自学能力了。
一个天才都不敢说出一个好的学习方案。
所以万事得靠自己。
网上有好多有关C语方的视频。我希望自己能在自学预习的情况下多看一些学习教程。
回复
snailbreak 2006-05-26

JF
回复
加载更多回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2006-04-24 01:20
社区公告
暂无公告