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/ ...
随机推荐
- git 修改最后一次提交
git 修改最后一次提交 有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了. 此时,可以运行带有 --amend 选项的提交命令来重新提交:git commit --amend -m ...
- Hive中的4种Join方式
common join 普通join,性能较差,存在Shuffle map join 适用情况:大表join小表时,做不等值join 原理:将小表数据广播到各个节点,存储在内存中,在map阶段直接jo ...
- TypeError: module() takes at most 2 arguments (3 given)
1. 错误提示 2. 代码 class Parent: """定义父类""" def __init__(self): print(" ...
- ORA-19815: WARNING: db_recovery_file_dest_size闪回区爆满问题处理
问题描述:有一个数据库起不来了,根据层层排查,是因为归档设置在了闪回区,文件的大小已经超出了闪回区限制.最后直接给数据库拖挂 环境:windows server2012 , oracle 19c,单机 ...
- nsq - 一条消息的生命周期(一)
经过前面几篇的学习,相信大家对nsq已经有了一个大概的了解,我在写这篇文章的时候也看了很多其他人写的教程,发现大家对于分析系统每个点写的很不错,但是都很少有整体串起来一起走一遍,所以,我打算分成2-3 ...
- Codeforces1514B
问题描述 给你两个数n,k,问可以构造多少n个最大位数为k数按位与为0并且这n个数加起来最大的合法序列,答案对1e9 + 7取模. 思路分析 首先我们考虑这n个数按位与以后为0这个条件:我们可以知道, ...
- the Agiles Scrum Meeting 12
会议时间:2020.4.20 21:00 1.每个人的工作 今天已完成的工作 个人结对项目增量开发组: 自动评测系统基本开发完成,实现个人项目自动评测功能 issues: 个人结对功能开发组:开发自动 ...
- BUAA_2020_软件工程_软件案例分析作业
项目 内容 这个作业属于那个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 学习掌握软件工程的相关知识 这个作业在哪个具体方面帮我实现目标 通过对具体软件案例的分析学习软件工程 ...
- STM32直流电机启动(一)驱动电路的介绍
驱动电路 典型的H桥驱动电路如下:要使电机旋转只需导通对角线上的两个三极管即可,如导通Q1,Q4,关闭Q2,Q4即可驱动电机正转:若想电机反向转动,即导通三极管Q2,Q3,关闭Q1,Q4.此时电路图可 ...
- Linux 系统 Oracle 11g 修改监听端口
1.查看监听:lsnrctl status 2.停止监听:lsnrctl stop 3.修改oracle安装目录的下的配置文件listener.ora:一般路径为自己Oracle安装目录+/app/o ...