目前最快的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));
}
-------------------------------
...全文
27312 135 打赏 收藏 转发到动态 举报
写回复
用AI写文章
135 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
加载更多回复(115)

69,512

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧