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 JDK环境变量如何配置?Java基础!
在了解什么是Java.Java 语言的特点以及学习方法之后,本节将介绍如何搭建编写 Java JDK环境变量如何配置,只有搭建了环境才能敲代码! 学Java的都知道,JDK 是一种用于构建在 Java ...
- Filter防火墙
实验简介 实验属于防火墙系列 实验目的 了解个人防火墙的基本工作原理: 掌握Filter防火墙的配置. 实验环境 一台安装了win7操作系统的主机. 预备知识 防火墙 防火墙(Firewall)是一项 ...
- 题解 「BJOI2018 治疗之雨」
题目传送门 题目大意 有一个初始为 \(p\) 的数,每次操作分为以下两个: 有 \(\frac{1}{m+1}\) 的概率$+1,但是中途 \(p\) 的最大值只能为 \(n\)$ 有 \(k\) ...
- 【学习转载】MyBatis源码解析——日志记录
声明:转载自前辈:开心的鱼a1 一 .概述 MyBatis没有提供日志的实现类,需要接入第三方的日志组件,但第三方日志组件都有各自的Log级别,且各不相同,但MyBatis统一提供了trace.deb ...
- 讲讲java中线程池的实现
今天跟一个同学谈到java中的线程池的实现,才发现有些知识点已经记不清了,所以特意把源码打开,对官方文档做了些说明. 其实这些理解了之后,读懂源码应该是没多大问题了,有感兴趣的小伙伴们可以看完说明后自 ...
- 【Java虚拟机4】Java内存模型(硬件层面的并发优化基础知识--缓存一致性问题)
前言 今天学习了Java内存模型第一课的视频,讲了硬件层面的知识,还是和大学时一样,醍醐灌顶.老师讲得太好了. Java内存模型,感觉以前学得比较抽象.很繁杂,抽象. 这次试着系统一点跟着2个老师学习 ...
- 【二食堂】Alpha - Scrum Meeting 6
Scrum Meeting 6 例会时间:4.16 11:40 - 12:10 进度情况 组员 昨日进度 今日任务 李健 1. 文本区域进度40%,UI需要进行调整issue 1. 继续文本区域的开发 ...
- 热身训练2 The All-purpose Zero
The All-purpose Zero 简要题意: 长度为n的数组,每个数字为S[i],$0$是一种很神奇的数字,你想要的,它都可以变! 问这个序列的最长上升子序列长度为多少? 分析: 我们将除了 ...
- 线程池系列二:一张动图,彻底懂了execute和submit
我们知道线程池通过execute方法执行提交的Runnable任务,但Runnable只是执行任务,没有返回任何信息. [线程池原理:线程池原来是个外包公司,打工人我悟了] 若是我们想在异步执行完 ...
- 零基础入门stm32基本定时器详解
一.基本定时器介绍 在STM32中,基本定时器有TIM6.TIM7等.基本定时器主要包含时基单元,提供16位的计数,能计数0~65535.基本定时器除了计数功能以外,还能输出给DAC模块一个TRGO信 ...