栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

基于C++的递归和回溯国际象棋女王安全算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于C++的递归和回溯国际象棋女王安全算法

资源下载地址:https://download.csdn.net/download/sheziqiong/85722216

递归和回溯 目标与要求

熟悉递归的基本思想 能够设计自己的递归函数。

关键是设计基本案例和感应步骤 了解回溯算法。

可以使用递归和回溯来解决特定问题。

实验环境(平台和软件)

Windows 7(或更高版本)+ Visual Studio 2010(或更高版本)

制定并验证一个程序,将八个女王放在棋盘上,这样就不会有女王受到任何其他女王的攻击。

定义一个名为 eightqueen 的类。我把所有的方法都放进去了,包括递归方法。 通过构造函数创建默认棋盘。然后定义方法 printchess() 和 goBack() 它们是更简单的。

最重要的方法是 isValid() 和 findPosition()。 但首先,我需要仔细考虑如何在 main()函数中放置 8 个女王。事实证明,最简单的方法是从国际象棋[0][0]开始逐排放置皇后,因为每行必须有 1 个 queen。

因此,在 isValid() 中,我只检查参数 r 和 c(即 chess[r][c])给出的位置“上面的行和列”,即:行 r 的每一列,左上角线和右上角的对角线。由于每次我每排放 1 个女王,就没有必要检查行中的国际象棋[r][c]。此外,默认返回值应为 1,因为除上述三种情况外,所有情况均有效。 在方法 findPosition()中,第一步应该是检查位置 chess[r][c],之后,如果它有效,它可以转到下一行找到一个可能的位置。

为了在下一行中搜索可能的女王并考虑到每列可能都有一个,我使用循环遍历每列,检查是否存在有效位置,即使用参数 r + 1,i 回溯 findPosition()(i 是循环中的列)。换句话说,我对每一行都调用此方法来搜索女王。如果有一个有效的位置,在国际象棋中输入 1[r+1][i]。

相反,如果最后一行没有有效的女王(即直到位置国际象棋[7][7]无效),它应该 goBack()这意味着最后一个位置 - 国际象棋[r][c]是错误的。(r+1 被转移到 findPosition() 所以当它被返回时,最后一个位置是 chess[r][c])

还需要提到的是,由于我转移参数 r+ 1 以在下一行中找到女王,因此 findPosition()的末尾应该是 r + 1

结果

以下是输出 92 个解决方案的过程: 为了找到位置并记录它们,并考虑到每行中必须有一个女王,我将 row 设置为数组,其值表示有效列。此外,棋盘(a[9][9])和解数(t)是外部变量。 为了方便起见,我将棋盘设置为具有 9 列和行的数组。在 Judge() 中,使用 abs() 也更容易使用 abs() — 查找对角线位置的绝对函数。在 findQueens() 中,有一个递归调用,以便在下一行中找到一个位置。如果它返回 void,这意味着下一行中没有有效位置,则每个位置将有 0。

结果分析与讨论(实验结果分析、收获总结及存在的问题)

检查的顺序是 Valid()和回溯以及如何同时在每条行中找到位置是困难的。很长一段时间以来,我一直在思考这两个序列,因为反向搜索和 goBack()的结束决定了 findPosition()的位置。

事实证明,理解回溯的最简单方法是首先找到递归的结尾,然后返回所需的值。这意味着,在找到有效位置之前对回避的停止进行编码。 为了找到可能的位置,我的方法是遍历每一列。虽然这不是一个有效的方法,但它仍然是找到一个可能的女王的安全方法。我的方法只能从国际象棋[0][0]开始找到一个解决方案。
是找到一个可能的女王的安全方法。我的方法只能从国际象棋[0][0]开始找到一个解决方案。

资源下载地址:https://download.csdn.net/download/sheziqiong/85722216
资源下载地址:https://download.csdn.net/download/sheziqiong/85722216

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982177.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号