【算法】N Queens Problem
/*
** 目前最快的N皇后递归解决方法
** N Queens Problem
** 试探-回溯算法,递归实现
*/
#include "stdafx.h"
#include "iostream"
#include <math.h>
using namespace std;
#include "time.h" // sum用来记录皇后放置成功的不同布局数;upperlim用来标记所有列都已经放置好了皇后。
long sum = , upperlim = ; // 试探算法从最右边的列开始。
void test(long row, long ld, long rd)
{
if (row != upperlim)
{
// row,ld,rd进行“或”运算,求得所有可以放置皇后的列,对应位为0,
// 然后再取反后“与”上全1的数,来求得当前所有可以放置皇后的位置,对应列改为1
// 也就是求取当前哪些列可以放置皇后
long pos = upperlim & ~(row | ld | rd);
while (pos) // 0 -- 皇后没有地方可放,回溯
{
// 拷贝pos最右边为1的bit,其余bit置0
// 也就是取得可以放皇后的最右边的列
long p = pos & -pos; // 将pos最右边为1的bit清零
// 也就是为获取下一次的最右可用列使用做准备,
// 程序将来会回溯到这个位置继续试探
pos -= p; // row + p,将当前列置1,表示记录这次皇后放置的列。
// (ld + p) << 1,标记当前皇后左边相邻的列不允许下一个皇后放置。
// (ld + p) >> 1,标记当前皇后右边相邻的列不允许下一个皇后放置。
// 此处的移位操作实际上是记录对角线上的限制,只是因为问题都化归
// 到一行网格上来解决,所以表示为列的限制就可以了。显然,随着移位
// 在每次选择列之前进行,原来N×N网格中某个已放置的皇后针对其对角线
// 上产生的限制都被记录下来了
test(row + p, (ld + p) << , (rd + p) >> );
}
}
else
{
// row的所有位都为1,即找到了一个成功的布局,回溯
sum++;
}
} int main(int argc, char *argv[])
{
time_t tm;
int n =; if (argc != )
n = atoi(argv[]);
tm = time(); // 因为整型数的限制,最大只能32位,
// 如果想处理N大于32的皇后问题,需要
// 用bitset数据结构进行存储
if ((n < ) || (n > ))
{
printf(" 只能计算1-32之间\n");
exit(-);
}
printf("%d 皇后\n", n); // N个皇后只需N位存储,N列中某列有皇后则对应bit置1。
//upperlim = (upperlim << n) - 1; upperlim = long(upperlim*pow(, n) - ); test(, , );
printf("共有%ld种排列, 计算时间%d秒 \n", sum, (int)(time() - tm));
system("pause");
return ;
}
【算法】N Queens Problem的更多相关文章
- 51nod 算法马拉松 34  Problem D  区间求和2 (FFT加速卷积)
		
题目链接 51nod 算法马拉松 34 Problem D 在这个题中$2$这个质数比较特殊,所以我们先特判$2$的情况,然后仅考虑大于等于$3$的奇数即可. 首先考虑任意一个点对$(i, j)$ ...
 - (算法)Hanoi Problem汉诺塔问题
		
Problem: There are three poles and N disks where each disk is heaver than the next disk. In the init ...
 - 《算法导论》Problem 2-4 Inversions
		
在Merge Sort的基础上改改就好了. public class Inversions { public static int inversions(int [] A,int p, int r) ...
 - 【克鲁斯卡尔蒜法-最小生成树算法】-zzuli-2271 -Problem -E-魔法交流活动
		
问题 E: 魔法交流活动 题目描述 魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接起来,形成一个魔法阵.魔法链是做法成功与否 ...
 - Jeff Somers's N Queens Solutions 最快的n皇后算法
		
/* Jeff Somers * * Copyright (c) 2002 * * jsomers@alumni.williams.edu * or * allagash98@yahoo.com * ...
 - 深入N皇后问题的两个最高效算法的详解                                                    分类:            C/C++             2014-11-08 17:22    117人阅读    评论(0)    收藏
		
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算 ...
 - [算法] N 皇后
		
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算 ...
 - N皇后问题算法
		
N皇后问题的两种主要算法是试探回溯法和位运算法.前一种是经典算法,后一种是目前公认的最高效算法,后者比前者效率提高了至少一个数量级.很多问题可以借鉴位运算的思想. 以下是转载的我认为写的比较好的一篇N ...
 - 惊叹计算机运行速度的提升---以n Queens 问题为例
		
1 介绍 实现了书<Data Structures and Program design in C++>(Robert L. Kruse and Alexander J. Ryba, 20 ...
 
随机推荐
- 查询一个字符串的子串出现的次数在sql中
			
select name,char_length(name)-char_length(replace(name,'aaaaaa','')) from teacher; 将原来的字符串字段取出长度 将子 ...
 - vlan  pvid  vid  access口 trunk口
			
VLAN技术浅谈 http://www.h3c.com.cn/MiniSite/H3care_Club/Data_Center/Net_Reptile/The_One/Home/Catalog/ ...
 - ASP.NET C# 获取当前日期 时间 年 月 日 时 分 秒
			
我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...
 - 【采集层】Kafka 与 Flume 如何选择
			
转自:http://my.oschina.net/frankwu/blog/355298 采集层 主要可以使用Flume, Kafka两种技术. Flume:Flume 是管道流方式,提供了很多的默认 ...
 - 《FPGA全程进阶---实战演练》第三章之PCB设计之去耦电容
			
1.关于去耦电容为何需要就近摆放? 大多数资料有提到过,去耦电容就近放置,是从减小回路电感的角度去谈及摆放问题,其实还有一个原则就是去耦半径的问题,如果电容离着芯片位置较远,超过去耦半径,会起不到去耦 ...
 - ImageNet Classification with Deep Convolutional Neural Networks 论文解读
			
这个论文应该算是把深度学习应用到图片识别(ILSVRC,ImageNet large-scale Visual Recognition Challenge)上的具有重大意义的一篇文章.因为在之前,人们 ...
 - linux -- ubuntu搭建nodejs环境
			
需求:在web端做一个实时性功能比较强的模块, 客户端:用websocket 服务端:node.js node.js介绍:node.js天生就是一个高效的服务端语言,可以直接使用 javascript ...
 - Ubuntu telnet
			
首先在Ubuntu中安装xinetd(它是inetd替代品): sudo apt-get install xinetd 再安装telnetd,在Ubuntu中没有telnetd这个软件包,它是包含在i ...
 - Labview按钮的机械动作
			
LabVIEW 对于按钮控件的机械动作提供了六个不同的选择,它们可以通过右键按钮并选择机械动作来找到.这些不同的选项导致按钮输出的值的行为不同.下里将这六个选项做一个简短的总结: 单击时转换当用鼠标将 ...
 - par函数的bg参数-控制图片的背景色
			
bg 参数用于控制图片的背景色,默认为白色 代码示例: par(bg = "pink") plot(1:5, 1:5, main = "title", xlab ...