第2讲 搜索算法-N皇后问题的自动求解.pptVIP

第2讲 搜索算法-N皇后问题的自动求解.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2讲 搜索算法-N皇后问题的自动求解 知识点 N皇后问题描述 1 N皇后问题的程序界面 1.1 需求分析 1.2 绘制N皇后的棋盘 阶段程序-NQueen1:绘制N皇后的棋盘 1.3 手动求解并判断解是否正确 阶段程序-NQueen2:手动求解并判断解是否正确 2 N皇后问题的自动求解 2.1 需求分析 2.2 自定义类实现绘制N皇后棋盘 阶段程序-NQueen3:自定义类实现绘制N皇后棋盘 2.3 搜索求解N皇后问题 阶段程序-NQueen4:搜索求解N皇后问题 3 参考程序 3.1 自动求解(引入线程同步) 3.2 控制台程序 4 期末作品参考 N皇后问题描述 问题描述: 要在N×N大小的棋盘上放置N个皇后,使得任意两个皇后不在同一行、同一列,以及对角线上。 换句话说,每一行、每一列都有且仅有一个皇后。但要注意,每条对角线上可能有一个皇后,但也可能没有,因为主对角线的数目为(2N-1)条,次对角线的数目也为(2N-1)条。 8皇后问题 N=8时,N皇后问题就成了经典的8皇后问题。 8皇后问题:要在8×8大小的棋盘上放置8个皇后,使得任意两个皇后不在同一行、同一列,以及对角线上。 8皇后问题的演示 数据结构与算法演示软件 数据结构算法|栈和队列|递归过程|皇后问题(注意观察回退过程) 8皇后问题的一个解 思考1:N皇后问题解的个数 N=1时,N皇后问题有1个解; N=2, 3时,N皇后问题无解; N=4有2个解,如下图所示。但把第2个解的棋盘转置(行变成列,列变成行)后,跟第1个解完全一样。 N皇后问题有多少个解?以8皇后问题为例。 当仅满足任意两个皇后不在同一行、同一列时,有8! = 40320种(why?)放置方法,再加上任意两个皇后不在对角线上,则满足条件的解有92个? 如果排除棋盘转置后一样的解,则8皇后问题有多少个解? N皇后问题的解之间有什么关联?这些解有什么特点? N皇后问题的解的个数跟N有关系吗? 思考2:如何理解对角线 N皇后中的对角线,以8皇后问题为例。主对角线一共有15条。我们将这种对角线称为第1种情形的对角线。 线性代数里行列式中的对角线,称为第2种情形的对角线。 8皇后问题中,第2种情形的主对角线有8条。 如果要求8皇后中的对角线为第2种情形,则8皇后问题有多少个解? 下图还是不是一个正确的解? 1 N皇后问题的程序界面 1.1 需求分析 N皇后问题的程序界面: 基于对话框的MFC应用程序; 能设置问题的规模N; 在对话框上绘制N×N的棋盘; 能手动求解:即对每个位置,第1次单击设置一个皇后,再次单击则取消; 能判定解是否正确,即用户设定的解是否满足N皇后问题的要求。 1.2 绘制N皇后的棋盘 本阶段要实现以下功能: 绘制规模为N的棋盘; 规模N可以改变; 一旦改变N,则重绘棋盘。 基础知识 在基于MFC的应用程序中实现绘图; 对比:基于API的应用程序绘图的实现; 为控件关联变量 控件型(control)变量:可以通过该变量引用控件。 也可以通过获取控件ID来引用控件。 数值型(value)变量:控件的值(如在编辑框中输入的值)存储该变量中,该变量值的变化也可以反映到控件中。 阶段程序-NQueen1:绘制N皇后的棋盘 实现步骤: 创建名为“NQueen”、基于对话框的MFC应用程序。 控件布局。各控件的ID分别为: 关于:IDC_ABOUT 退出:IDCANCEL 更改规模N:IDC_CHANGEN 编辑框:IDC_BOARD_SIZE 为编辑框控件关联变量m_N,并在构造函数中将该变量初始化为8。 为CNQueenDlg类添加如下图所示的成员变量。 在成员函数OnInitDialog()中初始化w、h、cell成员变量。 定义全局函数DrawBoard(),用于绘制指定规模、指定每格大小的棋盘。 修改成员函数OnPaint(),实现棋盘的绘制。 响应命令按钮“更改规模N”的单击事件,实现当N改变时重绘棋盘。 阶段程序1: 1.3 手动求解并判断解是否正确 本阶段要在上一阶段的基础上,实现以下功能: 通过鼠标单击的方式设置或取消某个位置上的皇后; 能判断用户设定的解是否正确。 基础知识: 指针数组: 指针:动态申请一维数组空间。 指针数组:动态申请二维数组空间。 阶段程序-NQueen2:手动求解并判断解是否正确 实现步骤: 在CNQueenDlg类中定义queen成员变量,用于存储用户设置的、各位置上是否有皇后。 在成员函数OnInitDialog()中初始化queen,通过new运算符申请21个长度为21的一维数组存储空间。 修改OnPaint函数,在适当位置添加以下代码,以实现在设置了皇后的位置上绘制亮黄色的圆圈。 修改命令按钮“更改规模N”的单击事件代码,使得N值改变后,将queen指

文档评论(0)

bodkd + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档