【题意】

输出N皇后问题的解法个数。

【题解】

解法一:传统dfs回溯,模拟Q放置的位置即可,应该不难,虽然能通过,但是时间复杂度很高。

解法二:位运算大法好!

首先要明白这道题里两个核心的位运算

1、x & -x 代表除最后一位 1 保留,其它位全部为 0(这个是不是很熟悉,就是树状数组的lowbit哦)

这里要明白计算机存储数的时候存储的是补码,假设x为0101000,正数的补码还是正数,-x为1101000,其补码为1011000,然后0101000 & 1011000,就是保留x的最后一位1。

2、x & (x - 1) 代表将最后一位 1 变成 0

如果x的最后一位是1,那么x-1后最后一位为0,其他位与x相同,所以相与后就将x的最后一位1变为0了。

如果x的最后一位是0,那么x-1后最后一位位1,且要向x的最后一位1借位,所以最后一位1处变为0,最后一位1 处前面位与x相同,所以相与后最后一位1变为0。这么说可能有点抽象,举个栗子,假设x为0101000,那么x-1为0100111,所以相与就是最后一位1变为0啦。

col、lx、rx代表每一行哪些位置可以放Q,0代表可以放,1代表不能放(col是列,lx是往左倾斜的斜线,rx是往右倾斜的斜线)

所以(t | lx) << 1,(t | rx) >> 1就不难理解了,比如t|lx 为00100,那么 << 1就是01000,是不是还蛮形象的

【代码】

 1 class Solution {
2 public:
3 int ans = 0;
4 void dfs(int row, int col, int lx, int rx, int n){
5 if (row >= n){
6 ans++;
7 return;
8 }
9 // q为该行能够放Q的位置
10 int q = ~(col | lx | rx) & ((1 << n) - 1);
11 while(q){
12 // 取出q的最后一位1
13 int t = q & (-q);
14 dfs(row + 1, t | col, (t | lx) << 1, (t | rx) >> 1, n);
15 // 将最后一位1变为0
16 q = q & (q - 1);
17 }
18 }
19 int totalNQueens(int n) {
20 dfs(0, 0, 0, 0, n);
21 return ans;
22 }
23 };

【LeetCode】52. N-Queens II(位运算)的更多相关文章

  1. HDOJ 5088 Revenge of Nim II 位运算

    位运算.. .. Revenge of Nim II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  2. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  3. Java实现 LeetCode 52 N皇后 II

    52. N皇后 II n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回 n 皇后不同的解决方案 ...

  4. LeetCode 78. 子集 C++(位运算和回溯法)

    位运算 class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { ...

  5. leetcode Single Number II - 位运算处理数组中的数

    题目描述: 给定一个包含n个整数的数组,除了一个数出现一次外所有的整数均出现三次,找出这个只出现一次的整数. 题目来源: http://oj.leetcode.com/problems/single- ...

  6. [LeetCode] Single Number II 位运算

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  7. 【Leetcode】 - Divide Two Integers 位运算实现整数除法

    实现两个整数的除法,不许用乘法.除法和求模.题目被贴上了BinarySearch,但我没理解为什么会和BinarySearch有关系.我想的方法也和BS一点关系都没有. 很早以前我就猜想,整数的乘法是 ...

  8. [LeetCode] 52. N皇后 II

    题目链接 : https://leetcode-cn.com/problems/n-queens-ii/ 题目描述: n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间 ...

  9. Java实现 LeetCode 832 翻转图像(位运算)

    832. 翻转图像 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...

  10. LeetCode刷题总结-双指针、位运算和分治法篇

    本文总结LeetCode上有关双指针.位运算和分治法的算法题,推荐刷题总数14道.具体考点分析如下图: 一.双指针 1.字符串和数组问题 题号:424. 替换后的最长重复字符,难度中等 题号:828. ...

随机推荐

  1. u-boot 移植 --->4、Tiny210核心板的DDR初始化下详解

    RAM的原理简单学习 DDR是RAM的一种,RAM常见的类型有SRAM,SDRAM,DDR他们的共同特点是,随机存储意味着读写速度快,掉电后数据丢失,所以常用来存储程序中的变量. SRAM 静态随机存 ...

  2. u-boot 移植 --->6、引导Linux启动测试

    在引导Linux开机之前需要先清楚Linux启动的必要或者说是先决条件,这里就是提到了u-boot的作用了引用百度云---主要用于嵌入式系统的引导加载,其实在我调试下来总结一下就是初始化硬件这里的硬件 ...

  3. Principle for iOS App Animation Design

    Principle for iOS App Animation Design Animate Your Ideas, Design Better Apps https://principleforma ...

  4. 钓鱼教程 All In One

    钓鱼教程 All In One youtube https://www.youtube.com/results?search_query=钓鱼教程&sp=CAM%3D 钓鱼证 https:// ...

  5. vue & modal props & form data update bug

    vue & modal props & form data update bug OK <div> <BindModal :dialogBindVisible=&qu ...

  6. vscode Paste Image插件使用

    Paste Image 在编写md需要插入图片,这个插件可以将粘贴板的图片保存到本地资源 假如我在/readme.md中编写文档,我需要将粘贴板的图片放在/images/下面,配置两个关键配置即可: ...

  7. 同样是NGK官方推出的代币,SPC与BGV有何异同?

    近日,币圈又火热了起来,而这次火热是由NGK搅动的.原来,NGK官方空投了200万枚SPC,用于奖励NGK算力持有者.当前,已经有一部分算力持有者获得了SPC奖励,有的算力持有者获得的SPC数量惊人, ...

  8. ImageCombiner - Java服务端图片合成的工具包,好用!

    自己的第一个也是唯一一个开源项目,因为平时比较懒,很少做宣传,今天刚好突破160个star,发到园子里推荐给大家,算是庆祝一下,哈. 项目地址:https://gitee.com/opensource ...

  9. C++算法代码——n的全排列/全排列问题

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1541 题目描述 输入一个整数n,输出的n(n<=100)的全排列. 输入 输入 ...

  10. 04_Mysql配置文件(重要参数)

    Mysql配置文件(重要参数) mysql配置文件的内容 打开my.ini文件(ProgramData默认隐藏,需取消隐藏) 绿色文字为注解,并不会被加载执行 删除注解,只保留重要有用的