Задача
Выведите двумерный массив, размерами [latex]n \times n[/latex], заполненный числами от [latex]1[/latex] до [latex]n^2[/latex] по спирали. Числовая спираль начинается в левом верхнем углу и закручивается по часовой стрелке.
Входные данные
Одно число [latex]n (1 \leqslant n \leqslant 10)[/latex].
Выходные данные
Выведите [latex]n^2[/latex] чисел – заполненный по спирали массив.
Тесты
№ | Ввод | Вывод |
1 | 1 | 1 |
2 | 2 | 1 2 4 3 |
3 | 3 | 1 2 3 8 9 4 7 6 5 |
4 | 5 | 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 |
5 | 9 | 1 2 3 4 5 6 7 8 9 32 33 34 35 36 37 38 39 10 31 56 57 58 59 60 61 40 11 30 55 72 73 74 75 62 41 12 29 54 71 80 81 76 63 42 13 28 53 70 79 78 77 64 43 14 27 52 69 68 67 66 65 44 15 26 51 50 49 48 47 46 45 16 25 24 23 22 21 20 19 18 17 |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <iostream> using namespace std; int main() { int **x, n; cin >> n; x = new int *[n]; for (int i = 0; i < n; i++) x[i] = new int[n]; int nc = n, num = 1; for (int z = 0; z < nc; z++) { for (int i = z; i < nc; i++) { x[z][i] = num; num++; } for (int i = z + 1; i < nc; i++) { x[i][nc - 1] = num; num++; } for (int i = nc - 2; i >= z; i--) { x[nc - 1][i] = num; num++; } for (int i = nc - 2; i >= z + 1; i--) { x[i][z] = num; num++; } nc--; } for (int l = 0; l < n; l++) { for (int k = 0; k < n; k++) { cout << x[l][k]; if (k != n - 1) cout << " "; } if (l != n - 1) cout << endl; } return 0; } |
Решение задачи
Все решение задачи сводится к тому, чтобы постепенно заполнять крайние квадраты, «окаймляя» внутренность массива и постепенно сужая диапазон заполнения и длину стороны заполняемого квадрата. В основном цикле вложенными циклами поочередно заполняем строки и столбцы: верхнюю, крайний справа, нижнюю, крайний слева. После «сворачиваем» вправо, когда вложенные циклы заканчиваются и во внешнем(основном) счетчик увеличивается на 1. Полный цикл на n действий делать смысла не имеет в силу того, что, дойдя до половины, массив уже будет полностью заполнен в строках ниже.
Уберите русский язык из постоянной ссылки
Спасибо за замечание, уже увидела и убрала.
Я вот все мечтаю, что кто-то напишет простую формулу $f_n(x,y)$, чтобы по координатам точки сказать что за число в ней. Пока что-то никто не сделал. Может это вообще невозможно? Как Вы думаете?
Число из матрицы порядка [latex]n[/latex], имеющей вид, идентичный тем, что приводятся в задаче?
Да, найти значение элемента x[i][j] по i и j. Но главное простой формулой без циклов.