Вывести некоторые значения в специальном формате - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь решить некоторые проблемы.но что-то не так с моим кодом.Проблема заключается в следующем: учитывая число n, выведите n * n в следующем формате.

Ввод:

n=3

Ввод:

 7 8 1 
 6 9 2 
 5 4 3

Вот мой код: (Я знаю, что в нем есть некоторые ошибки, но я не могу их исправить. Если у вас есть лучшие идеи, помогите мне.) Заранее спасибо.

#include<stdio.h>
#include<stdlib.h>
void oput(int **matrix,int n);
int main()
{   int x=0,y=0,n,k=1;
    scanf("%d",&n);
    int **matrix = malloc(sizeof(int)*n*n);
    if(matrix==NULL)
    {
        perror("can't allocate");
        return 1;
    }
    //Input values to x*y matrix
   while(n>=1)
    {
      for(x=0,y=n-1;x<n;x++)
      {
          matrix[x][y]=k++;
      }
      for(x=n-1,y=n-1;y>=0;y--)
      {
          matrix[x][y]=k++;
      }
      for(x=n-1,y=0;x>=0;x--)
      {
          matrix[x][y]=k++;
      }
      n--;
      }
      oput(matrix,n);
      free(matrix);
      return 0;
}
//output values by row.
void oput(int **matrix,int n)
{   
    int i=0,j=0;
    for(i=0;i<n;i++)
    {
       for(j=0;j<n;j++)
       {
          printf("%d ",matrix[i][j]);
       }
       printf("\n");
    }
}

Ошибка возникает во время выполнения.

1 Ответ

0 голосов
/ 30 сентября 2019

Ради интереса я работал над решением этой проблемы.Мне не разрешено писать комментарии по этому вопросу, поэтому я предположил, что запуск «спиральной нумерации» в верхнем правом углу матрицы был требованием проблемы.

Мое решение состоит в добавлениичисла по всему периметру, используя четыре разных цикла.И затем снова начать добавление уровня отступа.

#include <stdio.h>
#include <string.h>

void printMatrix( int *nMatrix, int n, char *title )
{
  int i, j;

  if( title )
    printf( "%s\n", title );

  for( i=0; i<n; i++ )
  {
    for( j=0; j<n; j++ )
    {
      printf( "%d\t", *(nMatrix+n*i+j) );
    }

    printf( "\n" );
  }
}

void main( int argc, char *argv[] )
{
  if( argc == 2 )
  {
    int n = atoi ( argv[1] );
    int i, j;

    printf( "Input value: %d\n", n );

    if( n > 0 && n <= 10 )
    {
      int spiral[n][n];
      int indentNr, x, y, lastNr=0;

      memset( spiral, 0, n*n*sizeof( int ));  

      /* As indentNr is incremented, inner frames are filled */
      for( indentNr=0; n-2*indentNr>0; indentNr++ )
      {
        /* Go South */
        for( x=indentNr, y=n-1-indentNr; x<n-indentNr; x++ )
        {
          spiral[x][y] = ++lastNr;
        }

        /* Go West (Village People, 1979) */
        for( y=n-2-indentNr, x=n-1-indentNr; y>=indentNr; y-- )
        {
          spiral[x][y] = ++lastNr;
        }

        /* Go North */
        for( x=n-2-indentNr, y=indentNr; x>=indentNr; x-- )
        {
          spiral[x][y] = ++lastNr;
        }

        /* Go East */
        for( y=1+indentNr, x=indentNr; y<n-1-indentNr; y++ )
        {
          spiral[x][y] = ++lastNr;
        }
      }

      /* Print results */
      printMatrix( &(spiral[0][0]), n, "Final spiral:" );

    }
    else
    {
      printf( "ERROR: 'n' too big!\n" );
    }
  }  
  else
  {
    printf( "USAGE: spiral n\n" );
  }
}

Обратите внимание, что:

  1. Ввод 'n' вставляется с главным аргументом (без scanf)
  2. Я ограничил 'n' до 10
  3. Это решение является итеративным.Я не анализировал рекурсивные решения
  4. Вероятно, есть более элегантное решение для пропуска всех 4 циклов для внутренних кадров с n = 1 и n = 2.Я не потратил много времени на выяснение этого
  5. Я тестировал как нечетные, так и четные сценарии, и оба, похоже, работают нормально.Я тестировал до п = 10.Я не ожидаю проблем с большими числами (за исключением проблем с презентациями в случае больших чисел), но не стесняйтесь сообщать мне обо всех ошибках.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...