2013-10-30 2 views
2

Я пытаюсь напечатать матрицу размера mxn по спирали. Я попытался работать с этим кодом через Java, и я смог правильно напечатать спираль, если rows = columns. Для неравных строк и столбцов я имею тенденцию к повторению в печати. Таким образом, он правильно печатает весь путь до центра, но затем повторяет один или несколько элементов. Я пробовал отлаживать, но не мог достичь далеко. Может ли кто-нибудь помочь мне с этим? Вот код, который я получил до сих пор.print mxn matrix spirally - 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) является одной. Это ошибка, поскольку, если высота одна, эта строка была бы напечатана первым внутренним циклом. И поэтому вам нужно условие для печати, только если высота больше единицы. Так будет и для четвертого внутреннего цикла.

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; 
    }