热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

八皇后问题思路

文章目录问题描述基本思路搜索过程问题描述在8*8的棋盘上,放置八个皇后,要求任意两个皇后不能在同一行、同一列、对角线上。基本思路规则:棋盘上有八个棋子所有棋子不能相互攻击状态:棋盘




文章目录


  • 问题描述
  • 基本思路
  • 搜索过程


问题描述

在8*8的棋盘上,放置八个皇后,要求任意两个皇后不能在同一行、同一列、对角线上。

img


基本思路

规则:


  1. 棋盘上有八个棋子
  2. 所有棋子不能相互攻击

状态:棋盘上棋子的分布情况,可以用含有八个分量的一维向量来表示,如[1,5,8,6,3,7,2,4]可以用来表示上图棋子的分布,第i个分量的取值为j,代表棋盘的第i列第j行放有棋子。

初始状态,棋盘上没有棋子,用[0,0,0,0,0,0,0,0]表示;目标状态就是符合游戏规则的棋子分布情况,我们不能直接确定它,但是可以通过规则来检验给定的状态是否为目标状态。

搜索:在众多状态中通过规则的检验找到答案


搜索过程

棋盘状态是有限的,通过搜索,我们已经可以找到问题的答案了。

接下来的内容,就和搜索效率相关。

既然我们要从众多状态中进行搜索,就需要考虑:应该以什么顺序进行搜索?

先从结果反向思考:

假如我们想要获得[1,5,8,6,3,7,2,4]这样的解,可以考虑在[1,5,8,6,3,7,2,0]的基础上搜索。[1,5,8,6,3,7,2,0]已经符合规则2即所有棋子不能相互攻击,只要在第8列的不同行加入棋子,找到满足规则2的情况即可。同理,想获得[1,5,8,6,3,7,2,0]这样的状态,可以考虑在[1,5,8,6,3,7,0,0]的基础上搜索,在第7列的不同行加入棋子,找到满足规则2的情况。以此类推,最终会回到初始棋盘上没有棋子的状态。

搜索的顺序:

与上面的过程相反,我们从空棋盘[0,0,0,0,0,0,0,0]开始逐列放置棋子,先在第一列放置棋子,共八种放置方式,此时[1,0,0,0,0,0,0,0]~[8,0,0,0,0,0,0,0]都满足规则2的要求,我们可以在其中任意一种状态的基础上进行扩展。于是,我们需要把这些满足规则2的状态存储起来,并选择其中的一种进行扩展。此时待扩展状态均只在第一列放置了棋子,并不需要考虑顺序问题。假设我们选择了[1,0,0,0,0,0,0,0]进行扩展,在第二列放置棋子仍有八种情况,符合规则2的状态为[1,3,0,0,0,0,0,0]~[1,8,0,0,0,0,0,0],也将其存储起来。接下来就涉及到了顺序问题。我们是从两列的状态扩展,还是从一列的状态进行扩展?

此时待扩展节点的存储为[[2,0,0,0,0,0,0,0]~[8,0,0,0,0,0,0,0],[1,3,0,0,0,0,0,0]~[1,8,0,0,0,0,0,0]],深度优先搜索从两列的状态开始扩展,而广度优先搜索从一列的状态进行扩展。前者使用栈来存储待扩展节点,而后者使用队列实现。

对于深度优先的办法,随着层数加深,如果找到解,问题就结束了,如果未能找到解,需要回到上一层继续扩展,直到找到解为止或者该问题没有解。



推荐阅读
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 在2022年,随着信息化时代的发展,手机市场上出现了越来越多的机型选择。如何挑选一部适合自己的手机成为了许多人的困扰。本文提供了一些配置及性价比较高的手机推荐,并总结了选择手机时需要考虑的因素,如性能、屏幕素质、拍照水平、充电续航、颜值质感等。不同人的需求不同,因此在预算范围内找到适合自己的手机才是最重要的。通过本文的指南和技巧,希望能够帮助读者节省选购手机的时间。 ... [详细]
  • 从高级程序员到CTO的4次能力跃迁!如何选择适合的技术负责人?
    本文讲解了从高级程序员到CTO的4次能力跃迁,以及如何选择适合的技术负责人。在初创期、发展期、成熟期的每个阶段,创业公司需要不同级别的技术负责人来实现复杂功能、解决技术难题、提高交付效率和质量。高级程序员的职责是实现复杂功能、编写核心代码、处理线上bug、解决技术难题。而技术经理则需要提高交付效率和质量。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 模块化区块链生态系统的优势概述及其应用案例
    本文介绍了相较于单体区块链,模块化区块链生态系统的优势,并以Celestia、Dymension和Fuel等模块化区块链项目为例,探讨了它们解决可扩展性和部署问题的方案。模块化区块链架构提高了区块链的可扩展性和吞吐量,并提供了跨链互操作性和主权可扩展性。开发人员可以根据需要选择执行环境,并获得奖学金支持。该文对模块化区块链的应用案例进行了介绍,展示了其在区块链领域的潜力和前景。 ... [详细]
  • 数据结构与算法的重要性及基本概念、存储结构和算法分析
    数据结构与算法在编程领域中的重要性不可忽视,无论从事何种岗位,都需要掌握数据结构和算法。本文介绍了数据结构与算法的基本概念、存储结构和算法分析。其中包括线性结构、树结构、图结构、栈、队列、串、查找、排序等内容。此外,还介绍了图论算法、贪婪算法、分治算法、动态规划、随机化算法和回溯算法等高级数据结构和算法。掌握这些知识对于提高编程能力、解决问题具有重要意义。 ... [详细]
author-avatar
手机用户2502896067
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有