热门标签 | 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]],深度优先搜索从两列的状态开始扩展,而广度优先搜索从一列的状态进行扩展。前者使用栈来存储待扩展节点,而后者使用队列实现。

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



推荐阅读
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 探索CNN的可视化技术
    神经网络的可视化在理论学习与实践应用中扮演着至关重要的角色。本文深入探讨了三种有效的CNN(卷积神经网络)可视化方法,旨在帮助读者更好地理解和优化模型。 ... [详细]
  • Java高级工程师学习路径及面试准备指南
    本文基于一位朋友的PDF面试经验整理,涵盖了Java高级工程师所需掌握的核心知识点,包括数据结构与算法、计算机网络、数据库、操作系统等多个方面,并提供了详细的参考资料和学习建议。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 中兴在2016年推出的乐心亲情手机,不仅具备时尚外观和高性能配置,还特别针对中老年用户进行了多项人性化设计,成为送给长辈的理想礼物。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 一家位于长沙的知名网络安全企业,现面向全国诚聘高级后端开发工程师,特别欢迎具有一线城市经验的技术精英回归故乡,共创辉煌。 ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 知识图谱与图神经网络在金融科技中的应用探讨
    本文详细介绍了融慧金科AI Lab负责人张凯博士在2020爱分析·中国人工智能高峰论坛上的演讲,探讨了知识图谱与图神经网络模型如何在金融科技领域发挥重要作用。 ... [详细]
  • MySQL InnoDB 存储引擎索引机制详解
    本文深入探讨了MySQL InnoDB存储引擎中的索引技术,包括索引的基本概念、数据结构与算法、B+树的特性及其在数据库中的应用,以及索引优化策略。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
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社区 版权所有