2016-08-19 2 views
2

이것은 내 루프 문입니다. 첫 번째 루프는 회전되지 않은 블록을 표시하고 두 번째 루프는 회전하고 n 번째 (사용자 입력) 번까지 두 번째 배열을 표시합니다. 내 문제는 2D 배열이 한 번 회전하지만 세 번째 이후의 회전은 수행하지 않는다는 것입니다. 내 2 차원 어레이가 표시 될 때마다 시계 방향으로 90도 회전하도록합니다.3x3 2 차원 배열을 n 번 시계 방향으로 회전하는 방법

 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

* 원래 * 블록을 계속 회전합니다. 이전 작업에서 블록을 회전해야합니다 (예 : 'newBlock'을'cnt' 루프의 마지막에'block'에 복사합니다. – Andreas

+0

원래 배열을 회전하기 만하면됩니다. –

+0

게다가, 코드는 회전이 아니라 트랜스 포즈를하고 있습니다. –

답변

3

귀하가 현재 배열을 조 변경하고 있기 때문에 현재 회전 코드가 잘못되었습니다. 이 작업을 두 번 수행하면 실제로 행렬이 원래 상태가 유지되므로 아무 작업도 수행하지 않습니다. 행렬을 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에서이 제자리 매트릭스 회전 코드를 적용.

+0

나는 이것을 시험해보고 있는데,'n = 3'에서 작동하지만 다른 값에 대해서는'ArrayIndexOutOfBoundsException'과 별난 결과가 나타납니다. – mapeters

+0

@mook 여기에 변수 'n'이 하나있는 오타가있었습니다. 나는 이것을 고쳤다. 현재 회전 코드를이 코드로 바꾸면됩니다. –

+0

아, 좋아요, 그냥'n '이 당신이 그것을 돌리고 싶었던 횟수라고 가정했습니다. 그러면'dim = 3' 이후'n = 3'에서 효과가 있었을 것입니다! – mapeters

관련 문제