2016-08-19 95 views
2

這些是我的循環語句。第一個循環顯示非旋轉塊,而第二個循環旋轉並以n(用戶輸入)次顯示二維數組。我的問題是,二維數組將旋轉一次,但不會旋轉第三次和以後的時間。每次顯示時,我都希望我的二維數組順時針旋轉90度。如何順時針旋轉3x3二維陣列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,因爲您只是轉置陣列。這樣做兩次實際上是無操作的,因爲它使矩陣保持其原始狀態。對於你來說,旋轉矩陣兩次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