Спиральная матрица в С++?

У меня есть программа, в которой я должен заполнить матрицу a[n][n] числами от 1 до n в виде спирали. Однако моя программа заполняет только границу матрицы. Мой вопрос в том, как я могу оптимизировать алгоритм, чтобы он заполнил весь 2d-массив.

#include <iostream>
using namespace std;
void print();
const int n=9;
int a[n][n];
int main()
{
    int counter=1,j=0,i=0;
    for(int i=0; i<n; i++)
    {
        a[i][j]=counter;
        counter++;
    }
    counter--;
    for(int k=0; k<n; k++)
    {

        a[n-1][k]=counter;
        counter++;
    }
    counter--;
    for(int i=n-1; i>=0; i--)
    {
        a[i][n-1]=counter;
        counter++;
    }
    counter--;
    for(int j=n-1; j>0; j--)
    {
        a[i][j]=counter;
        counter++;
    }
    print();
    return 0;
}

void print ()
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {

            cout<<a[i][j]<<'\t';
        }
        cout<<endl;
    }
}

person A.Petrov    schedule 31.01.2018    source источник
comment
Как вы написали, вам нужно 4 петли, одна для перехода влево, одна для спуска, одна для движения вправо и одна для повторного подъема. Тем не менее, вам нужно отслеживать, откуда и куда вам нужно идти. Например. В первый раз, когда вы идете налево, вы идете от 0 до n-1, во второй раз только от 1 до n-2 и т. д. Я убежден, что вы можете это сделать.   -  person kvantour    schedule 31.01.2018


Ответы (1)


Есть несколько вещей, которые нужно настроить:

  • Вам нужен еще один цикл вокруг того, что у вас уже есть, который повторяет ваше круговое движение для каждого витка спирали и уменьшает размер круга с каждой итерацией (это m в моем примере, который уменьшается до нуля).
  • Вы инициализируете int i и int j в начале вашей основной функции, но в циклах вы используете for (int i=0;...), что означает, что вы не используете значения ранее определенных целых чисел.

В итоге это выглядит так:

#include <iostream>

using namespace std;
void print();
const int n=6;
int a[n][n];
int main()
{
    int counter = 1;
    for (int m = n; m > 0; m--)
    {
        int j=n-m,i=0;
        for(i=n-m; i<m; i++)
        {
            a[i][j]=counter;
            counter++;
        }
        counter--;
        for(int k=n-m; k<m; k++)
        {
            a[m-1][k]=counter;
            counter++;
        }
        counter--;
        for(i=m-1; i>=n-m; i--)
        {
            a[i][m-1]=counter;
            counter++;
        }
        counter--;
        for(j=m-1; j>n-m; j--)
        {
            a[n-m][j]=counter;
            counter++;
        }
    }
    print();    
    return 0;
}

Используя ваш print(), это дает:

1       20      19      18      17      16                                                                                     
2       21      32      31      30      15                                                                                     
3       22      33      36      29      14                                                                                     
4       23      34      35      28      13                                                                                     
5       24      25      26      27      12                                                                                     
6       7       8       9       10      11

Обратите внимание, что здесь я выбрал n=6.

person lkriener    schedule 31.01.2018