在8X8棋盘中,我想知道如何实现棋盘的对称性。
许多职位只是镜像或旋转彼此(没有任何典当或铸造功能,方向无法区分)。
通过使用电路板的垂直,水平和对角线镜像的组合,始终可以将片段的位置固定在a1-d1-d4三角形内。
如何在国际象棋棋盘上实现这些对称? 是否取决于所选板表示的选择(位板,0x88,8x8阵列等)?
编辑1 :目标是实现结束表及其压缩的生成。
答案 0 :(得分:2)
如果您要压缩电路板,可以生成每个电路板的规范表示。 @DocBrown的older answer表达了这一点:
为了提高效率,您可以使用每个板的“规范表示”,定义如下。生成给定一个的所有对称板,将其中的每一个打包成一个字节数组,并在这些数组中保留数组,该数组被解释为一个大数字,具有最小值。这个打包表示是每个板的对称类的唯一标识符,可以很容易地放在字典/散列表中,这样可以测试该对称类是否已经非常有效。
这个问题是指N-queens problem,因为每个女王都无法区分,所以可以找到很多对称性。对于最终游戏板,这种情况(很少)是这样的,所以我不确定你会得到多少节省。
答案 1 :(得分:0)
首先,请记住,对此对称建模是优化。你不需要捕捉所有东西,这是努力,代表的复杂性和实现的好处之间的权衡。
此外,无法在a1-d1-d4三角形中本地化每个单独的部分。您需要立即担心电路板上的所有部件以及它们之间的相互关系。在a1和h1上处理两个车并没有意义,因为它们实际上都在a1上。
您可以做的是在对称性方面“整理”整个电路板。您需要一些算法来确定正常形式是什么。例如,你可能决定先将白王变成那个三角形,然后做任何剩下的变形,让白王继续前进,并将黑王移动到一个标准位置(我选择了国王,因为他们保证在棋盘上独特)。正如您所注意到的,许多变换只有在没有剩下的棋子并且铸造无效的情况下才有效,这无论如何都会限制可能性。
除了规范化之外,您还需要跟踪将板转换为正常形式所执行的操作,以便稍后撤消转换。例如,如果您向用户展示一系列获胜动作,最好是在真实的棋盘上,而不是转换的棋盘。
这种规范化可以与您构建的任何现有数据库结合使用。如果您知道X板的某些属性(例如获胜移动),并且Y板正常化到板X,那么您也知道Y板的属性,但需要撤消必要的转换。在向数据库添加位置时,应该基于规范化的板来执行此操作。
我不认为棋盘的底层表示对于这种技术的有用性特别重要。