2016-08-19 26 views
2

これは私のループ文です。最初のループは回転していないブロックを表示し、2番目のループは回転し、2次元配列をn(ユーザー入力)回表示します。私の問題は、2次元配列は一度回転しますが、3回目以降は回転しないことです。表示されるたびに2次元配列を時計回りに90度回転させたい。3x3 2d配列を時計回りに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

現在のローテートコードは、配列をトランスポーズするだけであるため、AFAIKが間違っています。これを2回行うことは、マトリクスを元の状態に残すので効果的です。行列を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が現れた箇所に1つのタイプミスがありました。私はこれを修正した。必要なのは、現在のローテーションコードをこれに置き換えるだけです。 –

+0

ああ、私はちょうど 'n'があなたがそれを回転させたい回数であると仮定しました。それは' dim = 3'以来 'n = 3'のために働いていたことに意味があります! – mapeters

関連する問題