Вывод матрицы по спирали на C++

141
09 июня 2019, 11:00

Нужно написать программу, которая будет выводить числа от 1 до n по спирали в таком направлении: 1 в левом верхнем углу, спускаемся вниз, вправо, вверх, влево, вниз и т.д. Размерность матрицы вводится с клавиатуры. Вот мой прекрасный код:

#include "pch.h"
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
using namespace std;
int main(void)
{
    int sw, sh, l, f, i = 0, j = 0;
    int counter = 0;
    printf("enter the widht of array: ");
    scanf_s("%d", &sw);
    printf("enter the height of array: ");
    scanf_s("%d", &sh);
    int** Ar = new int *[sw];
    for (int i = 0; i < sw; i++)
        Ar[i] = new int[sh];
    int n = 1, x = 0, y = 0, k = 1;
    int tw = 0, th = 0;
    l = sw;
    f = sh;
    /*for (i = 0; i < sw; i++)
    {
        for (j = 0; j < sh; j++)
        {
            *((int *)Ar + (i * sw) + j) = k++;
            printf("%3d", *((int *)Ar + (i * sw) + j));
        }
        printf("\n");
    }*/
    **Ar = 1;
    while (1)
    {
        switch (n)
        {
        case 1:
            for (int th = 0; th < sh; th++)
            {
                y++;
                *((int *)Ar + (x * sw) + y) = k++;
            }
            counter++ ;
            if (counter >= 3)
                sh--;
            break;
        case 2:
            for (th = 0; th < sh; th++)
            {
                y--;
                *((int *)Ar + (x * sw) + y) = k++;
            }
            counter++;
            if (counter >= 3)
                sh-- ;
            break;
        case 3:
            for (int tw = 0; tw < sw; tw++)
            {
                x++;
                *((int *)Ar + (x * sw) + y)= k++;
            }
            counter++;
            if (counter >= 3)
                sw--;
            break;
        case 4:
            for (tw = 0; tw < sw; tw++)
            {
                x--;
                *((int *)Ar + (x * sw) + y) = k++;
            }
            counter++;
            if (counter >= 3)
                sw--;
            break;
        }
        sw = l;
        sh = f;
        if (sw % 2 == 0)
        {
            if (x == y + 1 && x == sw / 2)
                break;
            else if ((x == 0 && y == 0) || (x == y + 1 && x < sw / 2)) n = 1;
            else if (x == y && x >= sw / 2) n = 2;
            else if (x + y == (sw - 1) && x < sw / 2) n = 3;
            else if (x + y == (sw - 1) && x >= sw / 2) n = 4;
        }
        else
        {
            if (x == y && x == (sw / 2) - 0.5)
                break;
            else if ((x == 0 && y == 0) || (x == y + 1 && x < sw / 2)) n = 1;
            else if (x == y && x > sw / 2) n = 2;
            else if (x + y == sw && x < (sw / 2) - 0.5) n = 3;
            else if (x + y == sw - 1 && x > sw / 2) n = 4;
        }
        for (i = 0; i < sw; i++)
        {
            for (j = 0; j < sh; j++)
                printf("%4d ", *((int *)Ar + (i * sw) + j));
            printf("\n");
            printf("\n");
        }
    }
        system("pause");
        return 0;
}

Вывод зациклен и я вот не могу разобраться. Помогите найти ошибку и, возможно, можете предложить код по-короче)

READ ALSO
Запаздывающие генераторы Фибоначчи (subtract_with_carry_engine)

Запаздывающие генераторы Фибоначчи (subtract_with_carry_engine)

Дали мне задание написать написать генератор случайных чисел методом фибоначчи с запаздываниемЯ нашёл, что subtract_with_carry_engine как раз то что...

222
Variadic templates передача и возврат по ссылке

Variadic templates передача и возврат по ссылке

Возможно ли при передаче пака параметров принять его по ссылке и что-то изменить в одном из параметров?

124
Два MPI_Bcast путают сообщения друг друга

Два MPI_Bcast путают сообщения друг друга

Задали нам на дом найти факториал 16!, используя MPIВсё хорошо считается до тех пор, пока два MPI_Bcast не начинают отправлять сообщения всем потокам

139