所有七种方式反映方阵的八分圆的算法

Tyl*_*den 5 c java arrays algorithm matrix

在甚至尺寸的方阵ss/4(s/2+1)可反射的基质周围七个不同的方式平方类型.例如,10 x 10矩阵的独特方块在下图中着色:

卦限

这15个方块可以以7种不同的方式围绕矩阵的水平轴,垂直轴和对角轴反射.

假设为nxn数组的每种类型的元素分配了唯一值,其中n是偶数,那么填充矩阵(C或Java)的最有效方法是什么?换句话说,给定您希望的任何结构中的15个值的列表,您需要通过反射使用15个值填充10 x 10阵列的其余部分.这样做的最快算法是什么?

作为一个例子,这是我第一次尝试(注意它使用基于一个的数组):

public static int[][] valueSquare = new int[11][11];
public static int[][] valueSquareType = {
        { 0, 40,  2, 12, 15, 20 },
        { 0,  2,  1,  4,  8, 12 },
        { 0, 12,  4, 25, 20, 15 },
        { 0, 15,  8, 20, 22, 18 },
        { 0, 20, 12, 15, 18,  0 },
};
static {
    for( int x = 1; x <= 5; x++ ) for( int y = 1; y <= 5; y++ ) valueSquare[ 11 - x ][ y ] = valueSquareType[x][y];
    for( int x = 1; x <= 5; x++ ) for( int y = 1; y <= 5; y++ ) valueSquare[ 11 - x ][ 11 - y ] = valueSquareType[x][y];
    for( int x = 1; x <= 5; x++ ) for( int y = 1; y <= 5; y++ ) valueSquare[ x ][ 11 - y ] = valueSquareType[x][y];
}
Run Code Online (Sandbox Code Playgroud)

对此的一个反对意见是它有一个冗余的起始器阵列,它反映了三种方式,而不是一个反映7种方式的最小起始器阵列.理想情况下,我想要一个初始数组,只有15个键值.此外,我尝试循环可能不是最快的方法.

vib*_*vib 1

除非我错过了一些东西,还有什么比这更快的呢?

for (int i = 1; i < n/2; i++) {
    for (int j = 0; j < i; j++) {
        M[i][j] = M[j][i]; // first complete the first quadrant
    }
}

for (int i = 0; i<n/2; i++) {
    for (int j = n/2; j < n; j++) {
        // then perform the three needed symmetries
        M[i][j] = M[i][n-j-1];
        M[n-i-1][j] = M[i][n-j-1];
        M[n-i-1][n-j-1] = M[i][n-j-1];
    }
}
Run Code Online (Sandbox Code Playgroud)