我正在使用Java中的24位位板来表示以下形式的游戏板:

00 01 02 03 04
05 06 07 08 09
10 11 XX 12 13
14 15 16 17 18
19 20 21 22 23


请注意,该板的中间有一个用“ XX”表示的孔。我已经生成了合法位板的列表,但是由于该板具有正方形的对称性,因此我可以丢弃大量已经由其对称表亲表示的位板。

为了检查这些对称性,我需要能够将电路板旋转90度,180度和270度并水平,垂直和对角线(在两个对角线上)镜像的功能。显然,我想利用位操作,但这就是我遇到的问题。我已经找到了一些有关如何在国际象棋棋盘上执行此操作的信息,但是我无法理解这个概念-更不用说如何将其应用于我自己的棋盘情况了。

有人可以通过一些解释向我展示如何高效旋转/镜面位板吗?

最佳答案

我在这里找到了最有效的方法的汇编:

http://chessprogramming.wikispaces.com/Flipping+Mirroring+and+Rotating

例如,垂直翻转64位板仅进行13次操作,并且没有任何if语句。旋转可以通过翻转和镜像的组合来完成。

第一次查看这些算法时,其中一些看起来就像魔术。要真正理解它们,它有助于在每次操作后转储板的状态。

10-06 11:44