C/C++

Задача C++. Срочно.

Дано число n. Создайте массив A[2*n+1][2*n+1] и заполните его по спирали, начиная с числа 0 в центральной клетке A[n+1][n+1]. Спираль выходит вверх, далее закручивается против часовой стрелки.
Входные данные
Программа получает на вход одно число n.

Выходные данные
Программа должна вывести полученный массив, отводя на вывод каждого числа ровно 3 символа.

Примеры
входные данные
2
выходные данные
12 11 10 9 24
13 2 1 8 23
14 3 0 7 22
15 4 5 6 21
16 17 18 19 20
#include <iostream>
#include <iomanip>
using namespace std;
class Direction {
public:
static void down(bool x) {
d = x;
l = u = r = false;
}
static void left(bool x) {
l = x;
d = u = r = false;
}
static void up(bool x) {
u = x;
d = l = r = false;
}
static void right(bool x) {
r = x;
d = l = u = false;
}
static bool down() {
return d;
}
static bool left() {
return l;
}
static bool up() {
return u;
}
static bool right() {
return r;
}
private:
inline static bool d = false;
inline static bool l = false;
inline static bool u = false;
inline static bool r = false;
};
int main() {
cout << " n: ";
int n;
cin >> n;
int m = 2 * n + 1;
int** matrix = new int* [m];
for (int i = 0; i < m; ++i) matrix[i] = new int[m];
int x = m * m;
int top = 0;
int left = 0;
int bottom = m - 1;
int right = m - 1;
int i = 0;
int j = m - 1;
Direction::down(true);
while (--x >= 0) {
matrix[i][j] = x;
if (Direction::down() && i < bottom) {
if (++i == bottom) {
--right;
Direction::left(true);
}
} else if (Direction::left() && j > left) {
if (--j == left) {
--bottom;
Direction::up(true);
}
} else if (Direction::up() && i > top) {
if (--i == top) {
++left;
Direction::right(true);
}
} else if (Direction::right() && j < right) {
if (++j == right) {
++top;
Direction::down(true);
}
}
}
puts("");
for (i = 0; i < m; ++i) {
for (j = 0; j < m; ++j) cout << setw(4) << matrix[i][j];
puts("");
}
for (i = 0; i < m; ++i) delete[] matrix[i];
delete[] matrix;
system("pause > nul");
}
Адильхан Кожахметов
Адильхан Кожахметов
77 063
Лучший ответ