【每日算法】位运算之N皇后问题

位运算技巧

x&(-x) 获取二进制位中最后一个1的位置
x&(x-1) 把二进制位中的最低位的1置成0

题目

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

普通解法

class Solution(object):
    def solveNQueens(self, n):
        res=[]#定义返回的结果
        def helper(row,hang,pie,na,path):
            if row==n:#如果遍历到最后一行了,则把结果保存起来
                res.append(path)
                return
            #开始进行一行的逐个尝试放置皇后
            for j in range(n):
                #如果一个位置的同列,右斜 左斜已经有元素了,则此位置不能放置皇后
                if j in hang or row-j in pie or row+j in na:
                    continue
                #找到一个放置皇后的位置后,计算出棋盘的布局
                tmp="."*j+"Q"+"."*(n-1-j)
                #一行确定一个皇后位置后,开始进行下一行的查找,并把当前的位置信息分别保存集合里
                helper(row+1,hang|{j},pie|{row-j},na|{row+j},path+[tmp])
        #从第0行开始往下找
        helper(0,set(),set(),set(),[])
        return res

位运算的解法

可以利用位运算记录皇后的信息,n*n的棋盘,则用n位的二进制位表示,位运算从右向左依次低位到到位,为了对应我们遍历棋盘从右向左遍历。

有上面的解法可知,我们需要三个变量来保存曾经的皇后信息, columns记录每列的上的皇后信息、 diagonals1记录左斜线上的皇后信息、 diagonals2记录右斜线上的皇后信息,以8行

【每日算法】位运算之N皇后问题
代码如下
class Solution:
    def solveNQueens(self, n):
        res=[]#定义返回的结果
        def helper(row,columns,diagonals1,diagonals2,path):
            if row==n:#如果遍历到最后一行了,则把结果保存起来
                res.append(path)
                return
            #获取有效的皇位的位置
            availablePositions=((1<<n)-1)&(~(columns|diagonals1|diagonals2)) while availablepositions: #获取最一个1的 position="availablePositions&-availablePositions" index="bin(position" - 1).count("1") tmp="." *index+"q"+"."*(n-index-1) helper(row+1,columns|position, (diagonals1|position)<<1 ,(diagonals2|position)>>1 ,path+[tmp])
                availablePositions=availablePositions&(availablePositions-1)
        #&#x4ECE;&#x7B2C;0&#x884C;&#x5F00;&#x59CB;&#x5F80;&#x4E0B;&#x627E;
        helper(0,0,0,0,[])
        return res
</n)-1)&(~(columns|diagonals1|diagonals2))>

Original: https://www.cnblogs.com/hitechr/p/15115477.html
Author: Hitechr
Title: 【每日算法】位运算之N皇后问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590444/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 掌握这些招数,你也能写出HR眼中的高分简历

    一、简历的定义 简历就是将自身的经历、工作成绩、个人能力、性格等信息简要地列举出来。根据使用简历的目的不同,可以将简历分为展示型简历和求职型简历。此处跟大家分享的是求职简历。 二、…

    Java 2023年6月7日
    066
  • SpringCloud:SpringCloud与SpringBoot版本对应关系

    SpringCloud官网 https://spring.io/projects/spring-cloud#learn 通过版本号点击 Reference Doc ; Suppor…

    Java 2023年5月30日
    072
  • 使用Gradle构建Java项目

    使用Gradle构建Java项目 这个手册将通过一个简单的Java项目向大家介绍如何使用Gradle构建Java项目。 我们将要做什么? 我们将在这篇文档中创建一个简单的Java项…

    Java 2023年5月29日
    0113
  • PMP 考试常见工具与技术点总结

    转载请注明出处: 网络图:项目进度活动之间的逻辑关系,用来推算关键路径,最大浮动时间等; 横道图(甘特图):以图示的方式,通过活动列表和时间刻度,来展示项目获得那个顺序和持续时间 …

    Java 2023年6月8日
    050
  • 12、SpringBoot 启动 刷新应用上下文 启动WEB容器

    目录:Springboot源码学习目录上文:11、SpringBoot 启动 刷新应用上下文 自动装配解析(三)前言:好了,终于将刷新应用上下文的自动装配流程的源码读完了,顺便也将…

    Java 2023年6月13日
    072
  • 抵达一颗安静的心

    素心免忧虑,心内止如水。俯仰观天地,信步采撷美。 ……其实啊,我只是像平常人一样,在工作和生活中探索和修行而已。 我喜欢漫步在宁静的自然中。花木草叶,鸟鸣溪…

    Java 2023年6月9日
    068
  • 【设计模式】Java设计模式-外观模式

    Java设计模式 – 外观模式 😄 不断学习才是王道🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆原创作品,更多关注我CSDN: 一个有梦有戏的人…

    Java 2023年6月16日
    090
  • eclipse安装Spring插件时报错

    eclipse安装Spring插件时报错: cannot perform operation.Computing alertnate solutions,may take a wh…

    Java 2023年5月29日
    077
  • Spring boot 定时器

    Timer:是java自带的java.util.Timer类,这个类允许调度一个java.util.TimerTask任务,使用这种方式可以让程序按照某一个频度执行,但不能在指定时…

    Java 2023年5月30日
    062
  • Spring

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月15日
    059
  • java stream 简单函数

    写在前面本文为笔者学习的一些心得,如有问题,评论请轻喷本文分为以下部分:中间操作终止操作归纳 中间操作 对 list 进行操作,返回一个新的 list 主要函数 作用 过滤操作 截…

    Java 2023年6月5日
    086
  • SpringBoot集成redis简要

    本文为redis服务的独立部署,内置到应用服务中同理,仅需要2、3、4三步(根据情况添加) 大致步骤: 详细步骤: 本人很懒,不想写安装,请移步其他道友: ​ applicatio…

    Java 2023年6月13日
    043
  • 控制反转,依赖注入,依赖倒置傻傻分不清楚?

    通过这篇文章,你将了解到 控制反转(IoC)是什么?「反转」到底反转了什么? Spring和IOC之间是什么关系? 依赖注入(DI)和依赖倒置原则(DIP)又是什么? IOC、DI…

    Java 2023年6月7日
    094
  • 三分钟:极速体验JAVA版目标检测(YOLO4)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kuberne…

    Java 2023年6月8日
    0120
  • Java基础之变量

    Java基础之变量 Java基础之变量 1.变量概述 1.1 为什么需要变量 1.2 简单理解 1.3 变量使用注意事项 1.4 程序中+号的使用 1.5 Java数据类型 1.6…

    Java 2023年6月15日
    085
  • Java源码赏析(三)初识 String 类

    由于String类比较复杂,现在采用多篇幅来讲述 这一期主要从String使用的关键字,实现的接口,属性以及覆盖的方法入手。省略了大部分的字符串操作,比如split()、trim(…

    Java 2023年6月8日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球