Требуется заполнить массив размера N × N единичками по спирали (начиная с верхнего левого угла по часовой стрелке, см. пример).
Входные данные: с клавиатуры вводится число N (нечётное, натуральное и не превышающее 50).
Выходные данные: требуется вывести на экран построенную спираль.
Пример:
Входные данные: 7
Выходные данные:
1111111
0000001
1111101
1000101
1011101
1000001
1111111
Ответы на вопрос
Спираль удобно строить не по отдельным шагам, а слоями. Сначала рисуется внешний квадрат, затем квадрат со смещением на две клетки внутрь, потом следующий и так далее.
Каждый слой состоит из четырёх сторон:
-
верхней;
-
правой;
-
нижней;
-
левой.
На левой стороне нужно оставить одну пустую клетку, чтобы витки спирали не замкнулись в отдельные прямоугольники. Верхнюю сторону внутренних слоёв следует продлевать на две позиции влево — так соседние витки соединяются в одну спираль.
Например, при N = 7 получится:
1111111 0000001 1111101 1000101 1011101 1000001 1111111
Решение на C++:
C++#include#include using namespace std;int main() { int n; cin >> n; vector<vector<int>> a(n, vector<int>(n, 0));
// k — расстояние текущего слоя от границы массива. // Между соседними витками должна оставаться одна пустая клетка, // поэтому каждый следующий слой начинается через две позиции. for (int k = 0; k <= n / 2; k += 2) { int right = n - 1 - k; int bottom = n - 1 - k;
// Верхняя сторона. // У внутренних слоёв продлеваем её на две клетки влево, // чтобы соединить с предыдущим витком спирали. int start = (k == 0 ? 0 : k - 2);
for (int j = start; j <= right; ++j) { a[k][j] = 1; }
// Правая сторона. for (int i = k; i <= bottom; ++i) { a[i][right] = 1; }
// Нижняя сторона. for (int j = k; j <= right; ++j) { a[bottom][j] = 1; }
// Левая сторона. // Клетка с координатой k + 1 остаётся нулевой — // это разрыв, благодаря которому получается спираль. for (int i = k + 2; i <= bottom; ++i) { a[i][k] = 1; } }
// Вывод массива без пробелов. for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cout << a[i][j]; } cout << '\n'; }
return 0; }
Внешний цикл выполняется примерно N / 2 раз, но суммарно обрабатывается не более N² элементов. Поэтому временная сложность алгоритма составляет O(N²), а объём дополнительной памяти — O(N²).
Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili

