2015-12-03 56 views
0

我正在編程一個國際象棋AI,並且遇到了一個我實現的方塊表的問題。由於我只想每面有一個平方的表,我需要一個函數來翻轉保存x軸值的一維數組。例如,該陣列:關於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,但我不能肯定我怎麼能在一維數組的情況下,使用這種技術。任何建議將被認真考慮。

回答

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(連續)的塊。

不管什麼方法,是應該做的,你可能還需要考慮只是保持你的網格的翻轉副本,並適當鏡像的變化。這樣,您就無需旋轉電路板,但需要更高的內存使用量(並且更難以編碼和/或維護)。

+0

非常詳細的回覆,非常感謝。 – nman

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