如何顺时针旋转3x3 2d阵列n次

时间:2016-08-19 01:18:21

标签: java

这些是我的循环语句。第一个循环显示非旋转块,而第二个循环旋转,并以n(用户输入)次数显示2d阵列。我的问题是2d数组将旋转一次,但不会旋转第三个和随后的时间。我希望每次显示时我的2d阵列顺时针旋转90度。

        rot = x.nextInt(); //user input for n rotations
        //initial block
        System.out.println("1");
        for(i=0; i<block.length; i++)
            {
                for(j=0; j<block[i].length; j++)
                    System.out.print(block[i][j]+"\t");
                System.out.println();
            }
        //rotated block
        for(cnt=2; cnt<=rot; cnt++)
        {
            System.out.println(cnt);
            for(i=0; i<block.length; i++){
                for(j=block.length-1; j>=0; j--){
                    newBlock[i][j] = block[j][i];
                    System.out.print(newBlock[i][j]+"\t");
                }
                System.out.println();
            }
        }

1 个答案:

答案 0 :(得分:3)

您当前的旋转代码是错误的AFAIK,因为您只是转置数组。这样做两次实际上是无操作,因为它使矩阵处于其原始状态。你应该直观地说,将矩阵旋转90度两次(即旋转一次180度)通常不会使矩阵保持不变。请尝试使用此旋转代码:

int dim = block.length;

for (int i=0; i <= (dim - 1)/2; i++) {
    for (int j=i; j < dim - i - 1; j++) {
        int p1 = block[i][j];
        int p2 = block[j][dim-i-1];
        int p3 = block[dim-i-1][dim-j-1];
        int p4 = block[dim-j-1][i];

        block[j][dim-i-1] = p1;
        block[dim-i-1][dim-j-1] = p2;
        block[dim-j-1][i] = p3;
        block[i][j] = p4;
    }
}

我从this Quora article改编了这个就地矩阵旋转代码。