/*
** 目前最快的N皇后递归解决方法
** N Queens Problem
** 试探-回溯算法,递归实现
*/
#include "stdafx.h"
#include "iostream"
#include <math.h>
using namespace std;
#include "time.h"// sum用来记录皇后放置成功的不同布局数;upperlim用来标记所有列都已经放置好了皇后。
long sum = 0, upperlim = 1;// 试探算法从最右边的列开始。
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) << 1, (rd + p) >> 1);}}else{// row的所有位都为1,即找到了一个成功的布局,回溯sum++;}
}int main(int argc, char *argv[])
{time_t tm;int n =8;if (argc != 1)n = atoi(argv[1]);tm = time(0);// 因为整型数的限制,最大只能32位,// 如果想处理N大于32的皇后问题,需要// 用bitset数据结构进行存储if ((n < 1) || (n > 32)){printf(" 只能计算1-32之间\n");exit(-1);}printf("%d 皇后\n", n);// N个皇后只需N位存储,N列中某列有皇后则对应bit置1。//upperlim = (upperlim << n) - 1;
upperlim = long(upperlim*pow(2, n) - 1);test(0, 0, 0);printf("共有%ld种排列, 计算时间%d秒 \n", sum, (int)(time(0) - tm));system("pause");return 0;
}

转载于:https://www.cnblogs.com/Areas/p/5650676.html

【算法】N Queens Problem相关推荐

  1. 关于“拜占庭将军算法”byzantine generals problem

    一.拜占庭将军算法的背景: 对于系统坏掉的风险,可以这样假设:我们的操作员可能会误操作.可能会被贿赂或背叛,系统本身可能就有木马程序,系统可能会被黑客或病毒占领,我们自己开发的系统可能有漏洞,我们的开 ...

  2. c语言炉石传说算法设计,FZU Problem 2232 炉石传说(匈牙利算法)

     Problem Description GG学长虽然并不打炉石传说,但是由于题面需要他便学会了打炉石传说.但是传统的炉石传说对于刚入门的GG学长来说有点复杂,所以他决定自己开发一个简化版的炉石传说. ...

  3. 算法实验三 Problem B电子老鼠闯迷宫

    Problem B 电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建 ...

  4. 算法实验三 Problem F木乃伊迷宫

    Problem F 木乃伊迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 木乃伊地下宫殿是一个6行6列的迷宫.作为敢到木乃伊地下宫殿里去探险的你,有没有跟木乃伊抓迷藏的 ...

  5. 判断一个数是否存在于一个非递减的有序数列中 算法(Ordered Search Problem)

    1. Description Given a list of n numbers in non-decreasing order A={a1,a2,⋯,an} such that a1≤a2≤⋯≤an ...

  6. 2155 Problem Description(floyd算法变型)

    2155 Problem Description(floyd算法变型) Problem Description Kudo's real name is not Kudo. Her name is Ku ...

  7. 算法设计与分析第5章 回溯法(二)【回溯法应用】

    第5章 回溯法 5.2 应用范例 1.0-1背包问题 有n件物品和一个容量为c的背包.第i件物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和 ...

  8. N皇后问题的两个最高效的算法

    N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算 ...

  9. c语言100块钱买100只鸡算法,JS计算输出100元钱买100只鸡问题的解决方法

    JS计算输出100元钱买100只鸡问题的解决方法 本文实例讲述了JS计算输出100元钱买100只鸡问题的方法.分享给大家供大家参考,具体如下: 问题: 公鸡5元一只,母鸡3元一只,小鸡1元买三只,我现 ...

最新文章

  1. 嵌入式开发从业人员生存状况
  2. SQL Server报“GUID应包含带4个短划线的32位数”
  3. 网易java实习面试_2019届网易JAVA实习2面经历
  4. 晟数学院 oracle,Oracle 控制文件存储解析
  5. Node的异步与java的异步_node.js和异步编程回文
  6. Hadoop之HDFS应用
  7. shell中Connection closed by foreign host问题解决
  8. 数据结构上机实践第四周项目1 - 建立单链表
  9. pythonplot下载_Matplotlib for Python Developers PDF 下载
  10. vijos 1071 01背包
  11. 国内外各大网站镜像源
  12. 薅羊毛赚钱,也可操作
  13. 自动驾驶赛道「孔雀东南飞」,何处安家?各有小算盘
  14. 论文写作 之 Related work
  15. 洛谷-P1425-小鱼的游泳时间
  16. linux rs,Linux中的RS, ORS, FS, OFS
  17. 福特汉姆大学计算机科学专业,福特汉姆大学计算机科学排名第131(2018年TFE美国排名)...
  18. Windows 10 上使用 CMake GUI 编译 Krita 源代码并使用 MinGW 64 作为构建工具
  19. 使用ARCHPR明文攻击爆破压缩包
  20. 量化投资之宏观篇 | 达里欧谈美国社会的矛盾及如何改良

热门文章

  1. liferay如何debug
  2. HashMap的7种遍历方式
  3. Pyppeteer 使用笔记
  4. 玩转Linux必备知识(一)
  5. 数值分箱与one-hot
  6. 完美图解教程 Linux环境VNC服务安装、配置与使用
  7. Spark MLlib实现的广告点击预测–Gradient-Boosted Trees
  8. [译]GC专家系列1:理解Java垃圾回收
  9. Python多线程原理与实现
  10. MySql+Socket 完成数据库的增查Demo