Tyl*_*den 5 c java arrays algorithm matrix
在甚至尺寸的方阵s有s/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个键值.此外,我尝试循环可能不是最快的方法.
除非我错过了一些东西,还有什么比这更快的呢?
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)