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 ...
随机推荐
- Entity framework 绑定到Datagridview的添加删除修改
Entity framework 绑定到Datagridview的添加删除修改 using System; using System.Collections.Generic; using System ...
- python爬取指定新闻
作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2894 给定一篇新闻的链接newsUrl,获取该新闻的全部信息 标题 ...
- NOIP2015题解
D1T1模拟 #include<bits/stdc++.h> #define re(i,l,r) for(int i=(l);i<=(r);i++) using namespace ...
- C++笔记整理(参考整理自各大博客)
为什么构造函数不能是虚函数,析构函数往往是虚函数? 静态存储区.无论在那里构建,其过程都是两步:首先,分配一块内存:其次,调用构造函数.好,问题来了,如果构造函数是虚函数,那么就需要通过vtable ...
- IPv4的编址方法
重难点: 1.IP地址有3位标识符,由ICANN进行分配. 2.两级的IP地址分为 ::={<网络号>,<主机号>}. 3.在同一个局域网上的主机或路由器的IP地址中的网络号必 ...
- B/S架构图解
- Mask rcn nanchor部分理解
Anchors Mask 生成锚框本质与SSD一样中心点个数等于特征层像素数框体生成围绕中心点Bbox的坐标是要归一化到0~1之间的,都是相对于输入图片的大小.基本生成方式:H乘np.sqrt(anc ...
- Servlet+jSP+java实现商品信息和流水的操作
设计思路:先是创建两个表,一个用来操作库内商品的增删改查,一个用来记录商品的流水信息. 设计过程:先对商品的属性进行创建javaBean编写,之后编写数据库连接类,之后编写数据库操作类,之后编写服务类 ...
- Java基础学习-关键字的概述和特点以及常量的概述和分类
1.关键字概述 -被Java语言赋予特定含义的单词 2.关键字的特点 -组成关键字的字母全部小写 -常用的代码编辑器,针对关键字有特殊的颜色标记,非常直观,所以我们不需要死记硬 ...
- Javascript的防抖和节流、VUE的防抖和节流
js原生 函数防抖:将几次操作合并为一此操作进行.原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置.这样一来,只有最后一次操作能 ...