翻转围绕x轴的一维阵列板表示

时间:2015-12-03 01:43:12

标签: java arrays performance chess bitboard

我正在编写国际象棋AI,并且遇到了我实现棋子方格表的问题。由于我只希望每侧有一个方块表,我需要一个函数来翻转保存x轴值的一维数组。例如,这个数组:

[ 2, 4, 5, 3, 5, 0, 1, 4, 2 ]

将翻到:

[ 1, 4, 2, 3, 5, 0, 2, 4, 5 ]

我使用以下方法使用嵌套循环为0x64数组实现了这一点(注意:示例仅为3x3,但以下函数调整为8x8);但是,我想知道是否有更高效的东西,因为时间问题。

public int[] gridFromPerspective(int[] grid){

    int[] flippedGrid = new int[64];

    for(int i = 7; i < 32; i += 8){
        for(int j = 0; j < 8; j++){
            flippedGrid[i-j] = grid[63-(i-j)];
            flippedGrid[63-(i-j)] = grid[i-j];
        }
    }
}

我知道你可以使用sq' = sq ^ 56轻松有效地翻转一块电路板,但我不确定如何在一维数组的情况下使用这种技术。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

这是一个稍微简单的版本,不会对网格尺寸进行硬编码。

private static int[] flipVertically(int[] grid) {
    final int width = (int)Math.sqrt(grid.length);
    int[] flippedGrid = new int[grid.length];
    for (int i = 0; i < grid.length; i += width)
        System.arraycopy(grid, i, flippedGrid, grid.length - width - i, width);
    return flippedGrid;
}

答案 1 :(得分:1)

您使用的方法实际上并不是围绕x轴翻转电路板,而是完全旋转电路板。实质上,grid[0]将始终与flippedGrid[63]具有相同的值。如果你想从其他玩家角度查看棋盘,这实际上是正确的,你可以将你的循环减少到

for (int i = 0; i < 64; i++) {
    flippedGrid[i] = grid[63-i];
}

这应该可以提供(非常)小的性能提升。

如果您确实想要围绕x轴翻转电路板,可以使用System.arraycopy来提高性能:

for (int i = 0; i < 8; i++) {
    System.arraycopy(grid, 8*i, flippedGrid, 64 - 8*(i+1), 8);
}

这样,您可以让JVM立即复制长度为8(一行)的块,而不是复制单个值。

无论方法应该做什么,您可能还想考虑只保留网格的翻转副本并适当地镜像更改。这样,您就不需要旋转电路板,代价是更高的内存使用量(并且更难以编码和/或维护)。