【问题标题】:Flip one dimensional array board representation about the x axis围绕 x 轴翻转一维阵列板表示
【发布时间】:2015-12-03 01:43:11
【问题描述】:

我正在编写国际象棋 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 轻松有效地翻转位板,但不确定如何在一维数组的情况下使用此技术。任何建议将不胜感激。

【问题讨论】:

    标签: java arrays performance chess bitboard


    【解决方案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(一行)的块。

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

    【讨论】:

      【解决方案2】:

      这是一个稍微简单一点的版本,它没有对网格大小进行硬编码。

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 2016-09-22
        • 1970-01-01
        • 2017-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多