Код выглядит ужасно, да еще и не работает. Змейка с++

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
    int n = 0, m = 0;
    int hernya[200][200];
    //int hernya[n][m] = {0};
    cin >> n >> m;
    int woof = 0, bark = m, gap = 0, a = 4, y=1, b = 3, c = 2, d = 1, kyoko = 1, makoto = n,i=0,j=0, love = m - 1, rire = m - 2, strade = n -1, obosrysh=0,lawrence = 0, cain = 0, emae=n, ren = n - 2;
    int blin = n * 2;
    
   
    if (m==3 and n==5) {
        blin = 6;
        }
    if (m==3 and n==4) {
        blin = 6;
        }
   
    if (m==1) {
        while (emae>0) {
    cout << setw(4) << y;
    y++;
        emae--;
            cout << endl;
    }
    }
     else if (n==1 and m==2) {
     cout << setw(4) << "1";
        cout << setw(4) << "2";
    }

    else  {
        // ;;;;;;;;;;;;;;;;;;;;;;;
    while (blin >0) {
        if (a % 4 == 0) {
            i = gap;
            for (int j = woof; j < bark; j++) {
                hernya[i][j] = y;
                y++;
            }
            woof++;
            bark--;
            gap++;
            
            
        }
        else if (b % 4 == 0) {
            j = love;
            for (int i = kyoko; i < makoto; i++) {
                hernya[i][j] = y;
                y++;
            }
            kyoko++;
            
           
            makoto = makoto-1;
            love--;
        

        }

        else if (c % 4 == 0) {
            i = strade;
            for (int j = rire; j >= obosrysh; j--) {
                hernya[i][j] = y;
                y++;
            }
            rire--;
            strade--;
            obosrysh++;
            
        }

        else if (d % 4 == 0) {
            j = lawrence;
            for (int i = ren; i > cain; i--) {
                hernya[i][j] = y;
                y++; 
            }
            lawrence++;
            ren--;
            cain++;
        
        }
        blin--;
        a++;
        b++;
        c++;
        d++;
    }
     for (int i=0; i<n; i++) {
        for (int j=0; j<m; j++) {
            cout << setw(4) << hernya[i][j];
    }
         cout << endl;
    }
    }
    return 0;
}

По данным числам n и m заполните двумерный массив размером n×m числами от 1 до n×m по спирали, выходящей из левого верхнего угла и закрученной по часовой стрелке, как показано в примере.

https://stepik.org/lesson/13026/step/15?unit=4378 вот задание

У меня не проходит 4 тест, у вас есть какие-то тесты, который мой код не проходит?


Ответы (2 шт):

Автор решения: Harry

Знаете, исправить ваш код, который, как вы сами говорите, выглядит ужасно...

Давайте подойдем с другой стороны. Как заполнять вашу матрицу? Надо заполнить внешнюю "рамку" последовательными числами, а потом — только уже с запомненного числа — заполнить точно так же рамку, но уже более узкую и низкую, на 2 уже и на 2 ниже. И так, пока не заполнится всё.

Т.е. примерно так:

#include <iostream>
#include <iomanip>

using namespace std;

void fill(int**a, int rb, int re, int cb, int ce, int N = 1)
{
    if (rb >= re || cb >= ce) return; // Заполнять уже нечего

    // Заполняем рамку
    for(int i = cb; i < ce; ++i)    a[rb][i] = N++;
    for(int i = rb+1; i < re; ++i)  a[i][ce-1] = N++;
    // Проверка случая, когда от рамки остается только одна строка/столбец
    if (ce > cb + 1 && re > rb + 1)
    {
        for(int i = ce-2; i >= cb; --i) a[re-1][i] = N++;
        for(int i = re-2; i > rb; --i)  a[i][cb] = N++;
    }
    // Переходим к меньшей матрице...
    fill(a,rb+1,re-1,cb+1,ce-1,N);

}


int main(int argc, char * argv[])
{
    int n, m;
    cin >> n >> m;
    int ** a = new int*[n];
    for(int i = 0; i < n; ++i) a[i] = new int[m];

    fill(a,0,n,0,m);

    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < m; ++j) cout << setw(4) << a[i][j];
        cout << endl;
    }
}
→ Ссылка
Автор решения: Laukhin Andrey

Не самый эффективный вариант, но идея простая. Шагаем по матрице. Если следующий шаг приводит к выходу за границы, или к уже пройденному элементу (Mij > 0), тогда делаем поворот по часовой стрелке.

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    int n, m;
    cin >> n >> m;
    int** M = new int*[n];
    for(int i = 0; i < n; i++) M[i] = new int[m];
    
    int size = n * m, num = 0, d = 0, i = 0, j = 0;

    while(num < size) {
        M[i][j] = ++num;
        
        int ni = i + dirs[d][0];
        int nj = j + dirs[d][1];
        
        if(ni < 0 || nj < 0 || ni >= n || nj >= m || M[ni][nj] > 0) d = ++d % 4;
        
        i += dirs[d][0];
        j += dirs[d][1];
    }
    
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; ++j) cout << setw(4) << M[i][j];
        cout << endl;
    }
    
    return 0;
}
→ Ссылка