2016-06-28 3 views
0

Я пытаюсь напечатать элементы массива по спирали manner..cant выяснить логическую ошибку в моем коде ..печатные элементы 2d массива в форме спирали

void spiral(int n,int m,int arr[][m]) 
{ 
    int t=0,r=m-1,b=n-1,l=0,dir=0; /* t->top b->bottom l->left r->right */ 
    int k,j; 
    // above parameters to manage the matrix.  

    // exit condition from loop 
    while (t<=b && l<=r) 
    { 
     // print top row 
     if (dir==0)       
     { 

      for (k=l;k<=r;k++) 
      { 
       printf("%d ",arr[t][k]); 

      } 
      dir=1; 
      t++; 

     } 

     // print right column 
     else if (dir==1)   
     { 

      for (k=t;k<=b;k++) 
      { 
       printf("%d ",arr[k][r]); 

      } 
      dir=2; 
      r--; 

     } 

     // print bottom row 
     else if (dir==2)    
     { 

      for (k=r;k>=l;k--) 
      { 
       printf("%d ",arr[b][k]); 

      } 
      dir=3; 
      b--; 

     } 

     // print left column 
     else if (dir==3)   
     { 

      for (k=b;k<=t;k--) 
      { 
       printf("%d ",arr[k][l]); 

      } 
      dir=0; 
      l++; 

     } 
    } 
} 
+3

Добро пожаловать на переполнение стека! Похоже, вам, возможно, потребуется научиться использовать отладчик для выполнения вашего кода. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+4

Пожалуйста, используйте комментарии, не разделяйте код. –

+0

Было бы полезно показать подходящую образец (неквадратную) матрицу в качестве входных данных и ожидаемый результат (см., Как создать MCVE ([MCVE])). Вы спирали по часовой стрелке или против часовой стрелки? Вы начинаете с верхнего левого, нижнего правого или одного из других углов? (Где элемент 'm [0] [0]' - внизу слева, сверху слева, где-то еще?) Похоже, что вы используете 'm [0] [0]' в верхнем левом углу, и вы начинаете вверху слева и спиралью по часовой стрелке - судя по комментариям. Но прояснение таких деталей помогает людям помочь вам получить ответ, который вы хотите. –

ответ

0

Чтобы выполнить задачу, там нет необходимо использовать переменную dir и проверить ее значение, поскольку все этапы повторяются в том же порядке.

Ошибка: k <= t был k >= t.

Вот возможная рабочая реализация:

void spiral(int n,int m,int arr[][m]) 
{ 
    int top = 0,    
     right = m - 1,  
     bottom = n - 1,  
     left = 0, 
     k; 

    while(top <= bottom && left <= right) 
    { 
     //print top row 
     for (k = left; k <= right; k++) 
     { 
      printf("%d ",arr[top][k]); 
     } 
     ++top; 

     //print right column 
     for(k = top; k <= bottom; k++) 
     { 
      printf("%d ",arr[k][right]); 
     } 
     --right; 

     //print bottom row 
     for(k = right; k >= left; k--) 
     { 
      printf("%d ",arr[bottom][k]); 
     } 
     --bottom; 

     //print left column 
     for(k = bottom; k >= top; k--) 
     // this was wrong ^^^^^^ in OP's code 
     { 
      printf("%d ",arr[k][left]); 
     } 
     ++left; 
    } 
} 

Живой пример HERE

Смежные вопросы