52. N-Queens II N皇后II
网址:https://leetcode.com/problems/n-queens-ii/
方法1:按照逻辑思路,通过回溯法解决问题。速度较慢!
class Solution {
public:
void backTracking(vector<string> res, int &ans, int r, int n)
{
bool legal = true; // 定义一个flag,用于判断某一行中的某个位置是否合法
if(r == n) // 表示已经遍历完所有行
{
ans++;
return;
}
for(int j = ; j<n; j++) // 判断当前行中的每个位置
{
legal = true;
for(int i = ; i<=r-; i++) // 判断此位置是否合法
{
// 分别判断 列、副对角线、主对角线
// j - (r-i)
if((res[i][j] == 'Q') || (res[i][j+i-r] == 'Q') || (res[i][j+r-i] == 'Q'))
{
// 说明此位置会被其他皇后攻击
legal = false;
break;
}
}
if(legal)
{
// 在此位置放置一个皇后
res[r][j] = 'Q';
// 将新的数据再次进行回溯
backTracking(res, ans, r+, n);
// 回溯完毕后切记恢复原来的状态,以剩余的for循环
res[r][j] = '.';
}
}
}
int totalNQueens(int n) {
string s(n, '.');
vector<string> vc(n, s);
int ans = ;
backTracking(vc, ans, , n);
return ans;
}
};

方法2:位运算
参考:https://www.bilibili.com/video/av46292575/?p=43
class Solution {
public:
void dfs(int &ans, int n, int row, int col, int pie, int na)
{
if(row == n) // 表示已经遍历完所有行
{
ans++;
return;
}
// 把int类型的col、pie、na以二进制来看待,0分别表示此格子不会被其他皇后以某种方式攻击,1表示会
// (col|pie|na)得到总的攻击情况,但我们需要的是当中 0 的位置,因为0的位置无法获取,所以
// 对(col|pie|na)取反,即'~'操作符。取反后,数据的后n位是满足我们的要求的
// 但是,前面原来的0都变成了1,所以要想办法把第n位之前的0还原为1
// (1 << n)-1) 即可产生000...001111这样一个数,将其&上原来的数,即可实现预想
int bits = ((~(col|pie|na))&(( << n)-));
while(bits) //
{
int pos = bits & -bits; // 得到一个只保留最后一位 1 ,其他的全为 0 的数
// 更新数据,注意对角线的挪移
dfs(ans, n, row+, col|pos, (pie|pos)<<, (na|pos)>>);
// 把bits去掉最后一位的 1
bits = bits & (bits-);
}
}
int totalNQueens(int n) {
int ans = ;
dfs(ans, n, , , , );
return ans;
}
};

52. N-Queens II N皇后II的更多相关文章
- Leetcode之回溯法专题-52. N皇后 II(N-Queens II)
Leetcode之回溯法专题-52. N皇后 II(N-Queens II) 与51题的代码80%一样,只不过52要求解的数量,51求具体解,点击进入51 class Solution { int a ...
- Java实现 LeetCode 52 N皇后 II
52. N皇后 II n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回 n 皇后不同的解决方案 ...
- leetcode 51. N皇后 及 52.N皇后 II
51. N皇后 问题描述 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后 ...
- 【leetcode-51,52】 N皇后,N皇后 II
N皇后(hard) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题 ...
- 洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II
洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II https://www.luogu.org/problemnew/show/P2616 题目描述 Farmer ...
- Leetcode之二分法专题-275. H指数 II(H-Index II)
Leetcode之二分法专题-275. H指数 II(H-Index II) 给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列.编写一个方法,计算出研究者的 h 指数. ...
- Leetcode之回溯法专题-90. 子集 II(Subsets II)
Leetcode之回溯法专题-90. 子集 II(Subsets II) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入 ...
- Leetcode之回溯法专题-47. 全排列 II(Permutations II)
Leetcode之回溯法专题-47. 全排列 II(Permutations II) 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2] ...
- 【P2616】 【USACO10JAN】购买饲料II Buying Feed, II
P2616 [USACO10JAN]购买饲料II Buying Feed, II 题目描述 Farmer John needs to travel to town to pick up K (1 &l ...
随机推荐
- redis 字符串(string)函数
字符串(string)函数 get 命令/方法/函数 Description Get the value related to the specified key 取得与指定的键值相关联的值 Para ...
- Simple Factory Pattern
Question: How do you achieve the functions of calculator by Object-Oriented ? Analysis: 1,The functi ...
- Spring Boot 指定某个依赖的版本
Spring Boot 是个很好的框架,他为了他的一些功能生效,定义了一些依赖的版本. 比如说:Spring Boot 1.5.x 中elasticSearch是2.4.x的,这个是他本身就定义好的. ...
- linux用户键拷贝文件
如果A用户没有权限写B用户下面的文件,可以用这个命令拷贝 scp AAA.tar.gz B用户名@IP:全路径
- python关于类和正则表达( 编写一个程序(类))
1.什么是类对象,实例对象 类对象:类名实例对象:类创建的对象 2.类属性: 就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本.对于公有的类属性,在类外可以通过类对象和实 ...
- create-react-app不暴露配置设置proxy代理
此方法可以在不暴露配置的情况下直接设置代理,非常便捷 在package.json里添加 "proxy":"http://institute.dljy.lzdev" ...
- sqflite插件简单使用 key======================
https://blog.csdn.net/weixin_34183910/article/details/86029912 https://blog.csdn.net/u013255127/arti ...
- .NET EF框架的安装、及三种开发模式
一.EF框架的安装: 要在VS(如Visual Studio 2012)中使用EF框架,就需要先进行安装. 我们需要给这个应用安装EntityFramework包,引入EF框架相关的内容,我们需要引入 ...
- 工作中常用的 Linux 命令
awk 示例: env变量值如下,需要获得pkg_url的链接值: {"name": "michael", "sex": "mal ...
- DTS(待了解)
DTS(待了解) vs trasaction事务 脏数据 && 脏数据的清理 永远返回非空对象(忌:返回空值) 异常: invoker(trackTrace:debug.releas ...