2013-10-30 62 views
2

我試圖以螺旋方式打印mxn大小的矩陣。我試圖通過Java來處理這段代碼,並且如果rows = columns,我能夠正確地打印螺旋線。 對於不相等的行和列,我傾向於重複打印。因此它可以正確地打印到中心,但是它會重複一個或多個元素。我嘗試過調試,但無法實現。 任何人都可以幫助我嗎? 這是我到目前爲止的代碼。螺旋狀地打印mxn矩陣 - java

public class SpiralMatrix { 
public static void main (String args[]){ 
    int[][] mat = { {1, 2, 3, 4, 5}, 
        {6, 7, 8, 9, 10}, 
        {11,12, 13, 14, 15}}; 
    int i,n=3,m=5,r=m-1,q=n-1; 
    while(q>0 && r>0){ 
     for(i=m-1-r;i<=r;i++){ 
      System.out.println(mat[m-1-r][i]); 
     } 
     for(i=n-1-q+1;i<=q;i++){ 
      System.out.println(mat[i][r]); 
     } 
     for(i=r-1;i>=m-1-r;i--){ 
      System.out.println(mat[q][i]); 
     } 
     for(i=q-1;i>=n-1-q+1;i--){ 
      System.out.println(mat[i][n-1-q]); 
     } 
     q--; 
     r--; 
    } 
} 
} 

這樣做的輸出如下:

1 
2 
3 
4 
5 
10 
15 
14 
13 
12 
11 
6 
7 
8 
9 
8 
7 

因此達到中間值9後回溯到8和7 PS:這不是一門功課,我刷牙我的面試技巧。並請在我身上輕鬆一下,我是一個終身學習者! 謝謝!我會感謝你的幫助。

回答

1

有關於此的討論this question,你可以在那裏看到很多答案。

而我的答案是this one

看起來你只是打印太多了,而且它似乎來自第三個循環的內部(並且在其他情況下,當高度大於第四個循環的寬度時)。

這是因爲您從右向左打印(第三個內循環),儘管高度(q)爲1。這是一個錯誤,因爲如果高度是1,那麼該行將被第一個內部for循環打印出來。所以只有在高度大於1時才需要打印條件。第四個內部for循環也是如此。

public class SpiralMatrix { 
    public static void main (String args[]){ 
     int[][] mat = { {1, 2, 3, 4, 5}, 
         {6, 7, 8, 9, 10}, 
         {11,12, 13, 14, 15}}; 
     int i,n=3,m=5,r=m-1,q=n-1; 
     while(q>0 && r>0){ 
      for(i=m-1-r;i<=r;i++){ 
       System.out.println(mat[m-1-r][i]); 
      } 
      for(i=n-1-q+1;i<=q;i++){ 
       System.out.println(mat[i][r]); 
      } 
      for(i=r-1;i>=m-1-r && q>1;i--){ 
       System.out.println(mat[q][i]); 
      } 
      for(i=q-1;i>=n-1-q+1 && r>1;i--){ 
       System.out.println(mat[i][n-1-q]); 
      } 
      q--; 
      r--; 
     } 
    } 
} 
+0

啊!輝煌..我明白你的觀點!非常感謝 – Sid

0
public class SpiralMatrix { 
    public static void main(String[] args) { 
     int a[][] = {{1, 2, 3, 4,21,26}, 
       {5, 6, 7, 8,22,27}, 
       {9, 10, 11, 12,23,28}, 
       {13,14,15,16,24,29}, 
       {17,18,19,20,25,30}, 
       {31,32,33,34,35,36}}; 
     System.out.println(a[0].length); 
     for(int i=0; i<6; i++) { 
      for(int j=0;j<6;j++){ 
       System.out.print(a[i][j] + " , "); 
      } 
      System.out.println(); 
     } 
     int m=6,n=6; 

     for (int i=0;i<m;i++) { 
      int j=i; 
      for(;j<n;j++){ 
       System.out.print(a[i][j] + " , "); 
      } 

      for(j=i+1;j<m;j++) { 
       System.out.print(a[j][n-1] +" , "); 
      } 
      for(j=n-2;j>=i;j--){ 
       System.out.print(a[m-1][j] + " , "); 
      } 
      for(j=m-2;j>i;j--){ 
       System.out.print(a[j][i] + " , "); 
      } 
      m=m-1; 
      n=n-1;   
     } 
    } 

} 
//tried to simplfy the code to print a square matrix spiral way. 
//complete code given, please post if feel any modification required. 
+3

解釋你在做什麼,一些代碼本身不應該形成一個答案 –

+0

只是編輯原始帖子。 – iinpw

0

您需要在每次機器人轉動90度的時候,如果條件!

public static Stack<int> SpiralTraverse(int[,] arr) 
    { 
     Stack<int> trav = new Stack<int>(); 
     int m = arr.GetLength(0)-1; //end point (m,n) 
     int n = arr.GetLength(1)-1; 
     int k = 0; int l = 0; // starting point (k,l) 
     int i; //index 
     while(k <= m && l <= n) 
     { 
      for (i= l; i <= n; i++) 
      { 
       trav.Push((int)arr[k, i]); 
      } 
      k++; 
      for (i = k; i <= m; i++) 
      { 
       trav.Push((int)arr[i, n]); 
      } 
      n--; 
      if (k < m) 
      { 
       for (i= n;i>= l; i--) 
       { 
        trav.Push((int)arr[m,i]); 
       } 
       m--; 
      } 
      if (l < n) 
      { 
       for (i= m;i>= k; i--) 
       { 
        trav.Push((int)arr[i, l]); 
       } 
       l++; 
      } 
     } 
     return trav; 
    }