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 ...
随机推荐
- 一个handle使用更新线程的实例
handle更新线程实例 package com.example.administrator.handle; import android.app.Activity;import android.os ...
- intellij idea 官方帮助文档翻译(一)安装
安装需求: 硬件需求: 最低2GB内存,推荐4GB内存 最少要有1.5GB的硬盘空间,以及1GB空间用于缓存 最低1024*768的分辨率 软件需求: intellij idea中包含了jre 1.8 ...
- MyBatis探究-----为实体类Bean取别名,配置typeAliases
1.单个实体类设置别名 1.1 不使用alias <typeAliases> <!-- typeAlias:为某个java类型起别名 ; type:指定要起别名的类型全类名; 默认别 ...
- Mysql 导入文件提示 --secure-file-priv option 问题
MYSQL导入数据出现:The MySQL server is running with the --secure-file-priv option so it cannot execute this ...
- JAVA中for与while关于内存的细节问题
文/朱季谦 JAVA的程序结构有顺序结构,循环结构,分支结构,以及跳转结构,而循环结构里经常用到的无外乎有以下几种:for循环,while循环,以及do-while循环.本文主要讨论for循环与whi ...
- 最大熵模型(MEM)
1. 最大熵原理 最大熵Max Entropy原理:学习概率模型时,在所有可能的概率模型(即概率分布)中,熵最大的模型是最好的模型. 通常还有其他已知条件来确定概率模型的集合,因此最大熵原理为:在满足 ...
- MySQL_ALTER命令
当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 1)修改表名:表名可以在数据库中唯一标识一个table 命令格式:ALTER TABLE 旧名 RENAME 新名 ...
- 最长(大)回文串的查找(字符串中找出最长的回文串)PHP实现
首先还是先解释一下什么是回文串:就是从左到右或者从右到左读,都是同样的字符串.比如:上海自来水来自海上,bob等等. 那么什么又是找出最长回文串呢? 例如:字符串abcdefedcfggggggfc, ...
- 常用sql语句总结(一)(查询)
常用sql语句总结(一)(查询) 数据操作语句:DML 数据定义语句:DDL 数据控制语句:DCL (执行顺序------序号) 一.基本查询: 1. SELECT * ----- 2 FROM 数据 ...
- bzoj 4770 图样 - 概率与期望 - 动态规划
题目传送门 传送门I 传送门II 题目大意 有一个$n$个点的完全图,每个点的权值是$[0, 2^{m})$中的随机整数,两点间的边的权值是两点点权的异或和,问它的最小异或生成树的边权和的期望. 考虑 ...