N皇后问题解法
//
// 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皇后问题解法的更多相关文章
- java递归求八皇后问题解法
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
- 计蒜课--2n皇后、n皇后的解法(一般操作hhh)
给定一个 n*nn∗n 的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入 nn 个黑皇后和 nn个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条斜线(包括正负斜线)上,任意的两个白皇后都 ...
- N皇后回溯解法 leetcode N-Queens
class Solution { public: vector<vector<string> > solveNQueens(int n) { vector<vector& ...
- Python学习二(生成器和八皇后算法)
看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...
- JS算法之八皇后问题(回溯法)
八皇后这个经典的算法网上有很多种思路,我学习了之后自己实现了一下,现在大概说说我的思路给大家参考一下,也算记录一下,以免以后自己忘了要重新想一遍. 八皇后问题 八皇后问题,是一个古老而著名的问题,是回 ...
- Leetcode之回溯法专题-51. N皇后(N-Queens)
Leetcode之回溯法专题-51. N皇后(N-Queens) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给 ...
- N皇后问题(递归)
//八皇后递归解法 //#include<iostream> //using namespace std; #include<stdio.h> ] = {-,-,-,-,-,- ...
- 各大IT公司校园招聘程序猿笔试、面试题集锦
转自:http://blog.csdn.net/hackbuteer1/article/details/7959921#t4 百度一面 1.给定一个字符串比如“abcdef”,要求写个函数编程“def ...
- [Leetcode][Python]52: N-Queens II
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 52: N-Queens IIhttps://oj.leetcode.com/ ...
随机推荐
- Java基础之(二):Notepad++实现HelloWorld
现在我们开始编写我们的第一个程序:Hello World! HelloWorld 新建一个java文件 文件后缀名为.java Hello.java 代码分析: 接下来写完最大的框之后,那接下来当然就 ...
- GIS应用|快速开发REST数据服务
随着计算机的快速发展,GIS已经在各大领域得到应用,和我们的生活息息相关, 但是基于GIS几大厂商搭建服务,都会有一定的门槛,尤其是需要server,成本高,难度大,这里介绍一种在线GIS云平台,帮你 ...
- Java(31)泛型和可变参数
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228443.html 博客主页:https://www.cnblogs.com/testero ...
- Hadoop集群的配置(一)
摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得.以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问题.但是网上一些文档大多互相抄 ...
- flutter页面间跳转和传参-Navigator的使用
flutter页面间跳转和传参-Navigator的使用 概述 flutter中的默认导航分成两种,一种是命名的路由,一种是构建路由. 命名路由 这种路由需要一开始现在创建App的时候定义 new M ...
- Vue项目搭建常用的配置文件,request.js和vue.config.js
request.js用来请求数据,封装的代码如下: import axios from 'axios' const request = axios.create({ timeout: 5000 }) ...
- C语言中都有哪些常见的数据结构你都知道几个??
上次在面试时被面试官问到学了哪些数据结构,那时简单答了栈.队列/(ㄒoㄒ)/~~其它就都想不起来了,今天有空整理了一下几种常见的数据结构,原来我们学过的数据结构有这么多~ 首先,先来回顾下C语言中常见 ...
- 零基础入门Linux有什么好的学习方法吗?(超详细)
本节旨在介绍对于初学者如何学习 Linux 的建议,在这里不具体分析Linux的学习节点只分析对于零基础的伙伴的学习方法.那么如果你已经确定对 Linux 产生了兴趣,那么接下来我们介绍一下学习 Li ...
- Ubuntu鼠标变十字 不能点击
出现这种情况,应该是bash 直接运行了python文件 系统中出现了一个import 进程. python文件中除了注释应该是import在最前边 ps -ef|grep import 可以查看系统 ...
- 最近公共祖先 牛客网 程序员面试金典 C++ Python
最近公共祖先 牛客网 程序员面试金典 C++ Python 题目描述 有一棵无穷大的满二叉树,其结点按根结点一层一层地从左往右依次编号,根结点编号为1.现在有两个结点a,b.请设计一个算法,求出a和b ...