Ради интереса я работал над решением этой проблемы.Мне не разрешено писать комментарии по этому вопросу, поэтому я предположил, что запуск «спиральной нумерации» в верхнем правом углу матрицы был требованием проблемы.
Мое решение состоит в добавлениичисла по всему периметру, используя четыре разных цикла.И затем снова начать добавление уровня отступа.
#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" );
}
}
Обратите внимание, что:
- Ввод 'n' вставляется с главным аргументом (без scanf)
- Я ограничил 'n' до 10
- Это решение является итеративным.Я не анализировал рекурсивные решения
- Вероятно, есть более элегантное решение для пропуска всех 4 циклов для внутренних кадров с n = 1 и n = 2.Я не потратил много времени на выяснение этого
- Я тестировал как нечетные, так и четные сценарии, и оба, похоже, работают нормально.Я тестировал до п = 10.Я не ожидаю проблем с большими числами (за исключением проблем с презентациями в случае больших чисел), но не стесняйтесь сообщать мне обо всех ошибках.