结合2D阵列

时间:2015-02-25 13:46:11

标签: java arrays

我需要弄清楚如何转动3x3阵列

{{7,2,3},
 {0,4,8},
 {5,6,1}}

到9x9数组中,其中每个3x3部分是原始数组o,但每个值n都是n+(9*c),其中c是相应的部分。换句话说,第0,0部分(左上角)应该将其每个值更改为originalValue+(9*7),因为原始数组的左上部分是7.与右下角类似,但公式将是originalValue+(9*1)因为原始数组的右下部分是1。 新数组应该看起来像(仅包括提到的两个部分

{{70,65,66,0,0,0,0,0,0},
 {63,67,70,0,0,0,0,0,0},                   
 {68,69,64,0,0,0,0,0,0},               
 {00,00,00,0,0,0,0,0,0},//leading zeros added for easy legibility
 {00,00,00,0,0,0,0,0,0},         
 {00,00,00,0,0,0,0,0,0},         
 {0,0,0,0,0,0,16,11,12},            
 {0,0,0,0,0,0,09,13,17},             
 {0,0,0,0,0,0,14,15,10}}               

现在这里是困难的部分:然后我需要重复这个过程,但是使用这个9x9数组作为原始数组来获得27x27数组,然后再重复一次以获得更大的数组(81x81然后243x243等。)。

我已经能够得到方法addAllValues(),但我无法继续前进。

public static int[][] addAllValues(int[][] data, int value2){
    int value = value2 * 9;
    int[][] temp = data.clone();
    int[][] newData = temp.clone();
    for (int i = 0; i < temp.length; i++) {
        for (int j = 0; j < temp[0].length; j++) {
            newData[i][j] = temp[i][j] + value;
        }
    }
    return newData;
}

任何人都可以帮我吗?提前谢谢!

以下是我的尝试:

public static int[][] gen(int amount) {
    if (amount == 0) {
        return normal;
    } else {
        int[][] newArray = gen(amount-1);
        int[][] temp = new int[newArray.length*3][newArray.length*3];
        int[][][][] newArrays = {{addAllValues(newArray,7),addAllValues(newArray,2),addAllValues(newArray,3)},{addAllValues(newArray,0),addAllValues(newArray,4),addAllValues(newArray,8)},{addAllValues(newArray,5),addAllValues(newArray,6),addAllValues(newArray,1)}};
        for (int i = 0; i < temp.length; i++) {
            for (int j = 0; j < temp.length; j++) {
                int x=0,y=0;
                if (0 <= i && i < 3){
                    x = 0;
                } else if (3 <= i && i < 6){
                    x = 1;
                } else if (6 <= i && i < 9){
                    x = 2;
                }
                if (0 <= j && j < 3){
                    y = 0;
                } else if (3 <= j && j < 6){
                    y = 1;
                } else if (6 <= j && j < 9){
                    y = 2;
                }
                temp[i]
                        [j] = newArrays[x]
                        [y]
                        [i]
                        [j];
            }
        }
        return temp;
    }
}

1 个答案:

答案 0 :(得分:1)

好的,这是非常基本的。

你有一个方阵A。

    [a b c]
A = [e f g]
    [h i j]

将矩阵向右(水平)复制3次以获得[A A A],然后将条带复制3次到底部(垂直)以获得方形矩阵条

    [A A A]
B = [A A A]
    [A A A]

新矩阵每个维度大3倍,或者总共大9倍(每个&#34;区域&#34;)。现在您需要做的是修改每个子矩阵 - 添加原始矩阵中的相应元素。您需要找到子矩阵的索引(子部分的索引),并在原始矩阵中使用这些相同的索引来获得相应的标量。

[9*A(0,0)+A 9*A(0,1)+A 9*A(0,2)+A]
[9*A(1,0)+A 9*A(1,1)+A 9*A(1,2)+A]
[9*A(1,0)+A 9*A(1,1)+A 9*A(1,2)+A]

我们需要设置的最后一个链接是知道新矩阵B中哪个元素对应于哪个部分。 B大3倍,例如B [0..8,0..8]所以如果我们将B中元素的索引除以3(整数除法),我们得到它的部分,这就是A中标量的索引。

我们说元素B(r,c)位于(i,j)=(r/3, c/3)部分,因此该元素应使用A(i,j)进行修改。最后一句话几乎总结了它。