//
// Created by Administrator on 2021/8/5.
// #ifndef C__TEST01_NQUEENS_HPP
#define C__TEST01_NQUEENS_HPP #include <iostream>
#include <vector>
#include <unordered_set>
#include <unordered_map> using namespace std;
class NodeGraph; /* n皇后问题是指在N*N的棋盘上要摆n个皇后
* 要求任何两个皇后不同行不同列
* 给定一个整数n,返回n皇后的摆法有多少种
* n = 1, 返回1
* n = 2 or 3, 无论怎么摆都不行,返回0
* n = 8, 返回92
* */
class NQueens {
public:
int num1(int n){
vector<int> record(n);//第i行的皇后放在第几列
return process1(0, record, n);
} //目前来到的第i行,一共有n行
int process1(int i, vector<int> record, int n){
if(i == n){
return 1; //表示已经到了最后一行,所以次数加1
}
int res = 0;
for (int j = 0; j < n; ++j) {
//第i行的皇后放在第j列是不是有效的
if(isValid(record, i, j)){
record[i] = j;
res += process1(i+1, record, n);
}
}
return res;
}
bool isValid(vector<int> record, int i, int j){
for(int k = 0; k < i; k++){
if(j == record[k] || abs(record[k]-j) == abs(i-k)){
return false;
}
}
return true;
} int num2(int &n){
if(n < 1 || n > 32){
return 0;
}
int limit = n == 32 ? -1 : (1<<n)-1;
// -1就是32个1,
// 其余情况, 比如n是5 就是 100000-1 = (前面凑0)011111
return process2(limit, 0, 0, 0);
} int process2(int &limit,
int colLim, //列的限制, 1的位置不能放皇后,0的位置可以
int leftDiaLim,//左斜线的限制, 1的位置不能放皇后,0的位置可以
int rightDiaLim //右斜线的限制, 1的位置不能放皇后,0的位置可以
){
if(colLim == limit){
return 1;
}
int pos = 0;
int mostRightOne = 0;
//三个限制是或的关系,或在一起的1的位置不能放皇后
//再取反,就是0的位置不能放皇后
//与 limit 与,就是可以放皇后的位置
pos = limit & (~(colLim|leftDiaLim|rightDiaLim));
int res = 0;
while(pos != 0){
mostRightOne = pos & (~pos + 1);//取到可摆放位置的最右边的1
pos = pos - mostRightOne; //剩下的可以拜访的位置
res += process2(limit,
mostRightOne|colLim,
(mostRightOne|leftDiaLim) << 1,
(mostRightOne|rightDiaLim) >> 1);
}
return res;
}
}; #endif //C__TEST01_NQUEENS_HPP

N皇后问题解法的更多相关文章

  1. java递归求八皇后问题解法

    八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...

  2. 计蒜课--2n皇后、n皇后的解法(一般操作hhh)

    给定一个 n*nn∗n 的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入 nn 个黑皇后和 nn个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条斜线(包括正负斜线)上,任意的两个白皇后都 ...

  3. N皇后回溯解法 leetcode N-Queens

    class Solution { public: vector<vector<string> > solveNQueens(int n) { vector<vector& ...

  4. Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  5. JS算法之八皇后问题(回溯法)

    八皇后这个经典的算法网上有很多种思路,我学习了之后自己实现了一下,现在大概说说我的思路给大家参考一下,也算记录一下,以免以后自己忘了要重新想一遍. 八皇后问题 八皇后问题,是一个古老而著名的问题,是回 ...

  6. Leetcode之回溯法专题-51. N皇后(N-Queens)

    Leetcode之回溯法专题-51. N皇后(N-Queens) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给 ...

  7. N皇后问题(递归)

    //八皇后递归解法 //#include<iostream> //using namespace std; #include<stdio.h> ] = {-,-,-,-,-,- ...

  8. 各大IT公司校园招聘程序猿笔试、面试题集锦

    转自:http://blog.csdn.net/hackbuteer1/article/details/7959921#t4 百度一面 1.给定一个字符串比如“abcdef”,要求写个函数编程“def ...

  9. [Leetcode][Python]52: N-Queens II

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 52: N-Queens IIhttps://oj.leetcode.com/ ...

随机推荐

  1. Spatial Analyst Tools(Spatial Analyst 工具)

    Spatial Analyst Tools 1.区域分析 # Process: 以表格显示分区几何统计 arcpy.gp.ZonalGeometryAsTable_sa("", & ...

  2. CAD/DWG图Web网页可视化技术之栅格和矢量瓦片

    背景 在上一篇博文中CAD图DWG解析WebGIS可视化技术分析总结提到,实现CAD/DWG图形Web展示的思路一般为解析AutoCAD图形格式,然后转成html5所能绘制的格式如svg,geojso ...

  3. git 修改最后一次提交

    git 修改最后一次提交 有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了. 此时,可以运行带有 --amend 选项的提交命令来重新提交:git commit --amend -m ...

  4. Java基础-Java8新特性

    一.Lambda表达式 在了解 Lambda 之前,首先回顾以下Java的方法. Java的方法分为实例方法,例如:Integer的equals()方法: public final class Int ...

  5. rabbitmq死信队列和延时队列的使用

    死信队列&死信交换器:DLX 全称(Dead-Letter-Exchange),称之为死信交换器,当消息变成一个死信之后,如果这个消息所在的队列存在x-dead-letter-exchange ...

  6. [BZOI2014]大融合——————线段树进阶

    竟然改了不到一小时就改出来了, 可喜可贺 Description Solution 一开始想的是边两侧简单路径之和的乘积,之后发现这是个树形结构,简单路径数就是节点数. 之后的难点就变成了如何求线段树 ...

  7. 同人逼死官方系列!从 DDC 嗅探器到 sddc_sdk_lib 的数据解析

    从 DDC 嗅探器到 sddc_sdk_lib 的数据解析 之前的 DDC 协议介绍 主要讲了设备加入.退出以及维持设备状态,而 SDK框架 sddc_sdk_lib 解析 主要讲了 SDK 库的结构 ...

  8. PHP笔记1__基础知识

    客户端: 美妙的网页组成(都是由浏览器解释): 1.HTML 2.CSS--给HTML化妆 3.客户端脚本编程语言(JavaScript等)--特效  服务器端: 1.Web服务器Apache/Ngi ...

  9. Swoft+Docker

    Docker 以下纯属个人理解: Docker就是一种虚拟机,将环境打包成镜像,等于做了一个Linux系统裁剪. 镜像就是我们安装系统的镜像,里面包含了你的代码和环境. 容器就是一个虚拟机,你可以用一 ...

  10. 文件与文件系统的压缩与打包 tar gzip bzip2

    1:linux下常见的压缩文件后缀: .gz .zip .bz2 打包后的: .tar.gz .tar.zip .tar.bz2 2:gzip: 压缩:gzip file 解压:gunzip file ...