e-olymp 841. Спираль

Условие

Вывести квадрат, состоящий из $N \times N$ клеток, заполненных числами от $1$ до $N^{2}$ по спирали.

Входные данные

В первой строке находится единственное число $N (2 \leq N \leq 100)$.

Выходные данные

Выводится $N$ строк по $N$ чисел, разделённых пробелами. Не допускается начинать спираль в ином, кроме верхнего левого, углу, закручивать спираль против часовой стрелки или изнутри наружу.

Тесты

Входные данные Выходные данные
1 3 1 2 3
8 9 4
7 6 5
2 4 1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
3 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
4 10 1 2 3 4 5 6 7 8 9 10
36 37 38 39 40 41 42 43 44 11
35 64 65 66 67 68 69 70 45 12
34 63 84 85 86 87 88 71 46 13
33 62 83 96 97 98 89 72 47 14
32 61 82 95 100 99 90 73 48 15
31 60 81 94 93 92 91 74 49 16
30 59 80 79 78 77 76 75 50 17
29 58 57 56 55 54 53 52 51 18
28 27 26 25 24 23 22 21 20 19

Программный код

Решение

Для того чтобы решить эту задачу нам нужно определить способ заполнения. Первым делом, если $N$ — нечетное, то находим центр матрицы и заполняем его числом $N \times N $ a[(n / 2)][(n / 2)] = (n * n);. В условии написано, что “Не допускается начинать спираль в ином, кроме верхнего левого углу, закручивать спираль против часовой стрелки или изнутри наружу.”, то есть начинать мы будем с верхнего левого угла. Для этого мы сделаем цикл for(int i = 0; i < (n / 2); i++); , в котором сделаем 4 такта. Каждый такт заполняет определенную часть матрицы:

    • 1 такт – заполняет верхнюю грань слева направо;
    • 2 такт – заполняет правую грань сверху вниз;
    • 3 такт – заполняет нижнюю грань справа налево;
    • 4 такт – заполняет левую грань снизу вверх, как показано на рисунке ниже.

Выводим все как обычную матрицу, но с одним условием, после последнего элемента не должно стоять пробела, поэтому я вывел последний элемент отдельно и после него осуществил переход на новую строку.


Ссылки:
Задача на e-olymp
Код на OnlineGDB
Код на Ideone
Засчитанное решение на e-olymp

Related Images:

6 thoughts on “e-olymp 841. Спираль

  1. Здравствуйте.
    1. Уберите кириллицу из постоянной ссылки.
    2. Ипользуйте LaTeX.
    3. Исправьте пробелы. Так как, вы ипользовали стиль отсупов » K & R «, вам нужны соответствующие пробелы.
    4. Расставьте знаки препинания.

    • Прошу прощения.
      Исправления:
      1. Использовали/ используйте.
      2. « K & R »

    1. Вы очень странновставили код в пояснение. Удалите и вставьте снова. Или уберите 3 вложенных тега span с кучей настроек по цветам и размерам. Должно віглядеть так a[(n / 2)][(n / 2)] = (n * n);
    2. Уберите из кода бессмысленные пустые строки или обоснуйте в тексте роль 4-х пустых строк перед return 0;.
    3. Старайтесь избегать «декоративных» символов в комментариях. Есть одно исключение для многострочных комментариев в заголовках, где в начале строк ставят *, но так много слешей ставят только, чтобы не забыть удалить перед тем как кому-то показывать. а строки из одних слешей точно стоит удалить. Я не смог найти стандарта оформления кода, где принято так комментировать, но если Вы где-то такой стандарт видели, напишите, пожалуйста ссылку для расширения моего кругозора.
    4. Пожалуйста, перенесите код с onlinegdb.com на ideone.com. Если когда-то сервис ideone.com прекратит существование мне придется писать программу по переносу ссылок с 1000 страниц. Мониторить два сервиса это для меня двойная работа.
    5. Уберите, пожалуйста, не относящиеся к делу комментарии про точку входа в консольное приложение и т.п. если есть.
    6. Сделайте название по общему шаблону. Может так как у Вас и лучше, но тогда менять 600 статей…

    По коду особых замечаний нет. Я бы решал иначе. но Ваша версия вполне имеет право на существование. Конечно можно сильно упростить код, если заметить, что мы всегда поворачиваем направо если дойдем до границ или встретим уже заполненную клетку. Тогда получится как-то так:

    Однако имеется возможность обойтись и без массива — просто вычислить число, которое должно быть в очередной клетке. Нужно только помнить ее позицию.

    • Благодарю, вроде все исправил.

Добавить комментарий