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/ ...
随机推荐
- Fiddler抓包一键生成代码
首先我们的需求场景是 用Fiddler抓到某个接口调用后,用代码来模拟调用,一般我们写代码会有3个步骤: 1设置http请求相关的参数:header,method,url,cookie等 2设置pos ...
- perl Encode模块的使用
编码问题是广泛存在的,只有正确的编码才能在不同的地方正确的显示内容.而在数据的获取和转移过程中,编码经常是很需要注意的问题.perl有功能很好的编码处理模块Encode.在程序里简单的use Enco ...
- CentOS 压缩解压
目录 命令 tar gzip.gunzip bzip2.bunzip2 zip.unzip 命令组合 打包:将多个文件合成一个总的文件,这个总的文件通常称为"归档". 压缩:将一个 ...
- springboot 事务执行全流程分析
springboot 事务执行全流程分析 目录 springboot 事务执行全流程分析 1. 事务方法执行前的准备工作 2. 业务代码的调用 3. 事务方法执行后处理 4. 业务代码在事务和非事务中 ...
- 【Spring】IoC容器 - 依赖查找
前言 上一篇文章已经学习了[IoC的主要实现策略]有2种: 1.依赖查找 2.依赖注入 这里稍加详细的介绍一下依赖查找 1.依赖查找的方式 依赖查找的方式可以以多种维度来划分: 1.按名称/类型/注解 ...
- jdbc简单学生管理系统
这个是java连接mysql数据库的一个简单学生系统,通过jdbc连接数据库. 工具类 JDBCuntils. package Student; import java.io.IOException; ...
- .NET 事件总线,简化项目、类库、线程、服务等之间的通信,代码更少,质量更好。
Jaina .NET 事件总线,简化项目.类库.线程.服务等之间的通信,代码更少,质量更好. 安装 Package Manager Install-Package Jaina .NET CLI do ...
- Linux主机入侵检测
检查系统信息.用户账号信息 ● 操作系统信息 cat /proc/version 用户信息 用户信息文件 /etc/passwd root:x:0:0:root:/root:/bin/bash 用户名 ...
- sip信令跟踪工具sngrep
概述 在VOIP的使用过程中,最常见的问题就是信令不通和语音质量问题. 通常的问题跟踪手段包括日志分析.抓包分析. 抓包的工具有wireshark.tcpdump等等,如果是只针对sip信令的抓包,则 ...
- Scrum Meeting 0425
零.说明 日期:2021-4-25 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成登录.注册A ...