这些是我的循环语句。第一个循环显示非旋转块,而第二个循环旋转,并以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();
}
}
答案 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改编了这个就地矩阵旋转代码。