0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: программирование на php, разработка на php, массив, улитка, матрица, угловые элементы</p>
1
<p>Теги: программирование на php, разработка на php, массив, улитка, матрица, угловые элементы</p>
2
<p>Однажды мне на глаза попалась задачка, которую кому-то из хабравчан предложили<strong>для решения на собеседовании</strong>. Суть её состояла в том, чтобы заполнить квадратную матрицу с размерностью n*n числами от 1 до n^2 по спирали, закручивающейся от элемента [0, 0] к центру по часовой стрелке.</p>
2
<p>Однажды мне на глаза попалась задачка, которую кому-то из хабравчан предложили<strong>для решения на собеседовании</strong>. Суть её состояла в том, чтобы заполнить квадратную матрицу с размерностью n*n числами от 1 до n^2 по спирали, закручивающейся от элемента [0, 0] к центру по часовой стрелке.</p>
3
<p>Поняв, что мысль о решении не дает мне покоя, я взялся вспоминать первый курс института. Минут 20 я рисовал квадратные матрицы разных размеров, пытаясь выявить закономерности, которые помогут упростить алгоритм обхода. Я выделил несколько интересных особенностей:</p>
3
<p>Поняв, что мысль о решении не дает мне покоя, я взялся вспоминать первый курс института. Минут 20 я рисовал квадратные матрицы разных размеров, пытаясь выявить закономерности, которые помогут упростить алгоритм обхода. Я выделил несколько интересных особенностей:</p>
4
<p>1.Каждый угловой элемент "улитки" (тот элемент, на котором происходит очередной поворот) можно легко рассчитать по формуле, зная размерность матрицы и номер шага:</p>
4
<p>1.Каждый угловой элемент "улитки" (тот элемент, на котором происходит очередной поворот) можно легко рассчитать по формуле, зная размерность матрицы и номер шага:</p>
5
C = l * s - M; l - размерность s - номер шага M - смещение<p><strong>Смещение</strong>- это сдвиг от "края" матрицы. Ведь на каждой итерации угловые элементы приближаются к центру. Соответственно, он меняется с каждым шагом. Изначально он равен 0. Для следующего шага (s+1) он рассчитывается так:</p>
5
C = l * s - M; l - размерность s - номер шага M - смещение<p><strong>Смещение</strong>- это сдвиг от "края" матрицы. Ведь на каждой итерации угловые элементы приближаются к центру. Соответственно, он меняется с каждым шагом. Изначально он равен 0. Для следующего шага (s+1) он рассчитывается так:</p>
6
M = M + delta; if(s % 2 != 0) delta = ceil(s / 2) s - номер шага<p>2.Зная угловой элемент и направление движения на следующем шаге, можно легко заполнить недостающие элементы.</p>
6
M = M + delta; if(s % 2 != 0) delta = ceil(s / 2) s - номер шага<p>2.Зная угловой элемент и направление движения на следующем шаге, можно легко заполнить недостающие элементы.</p>
7
<p>Что ж, думаю, что этих вещей вполне достаточно для реализации задачи. На мой взгляд, главной изюминкой решения является<strong>идея с угловыми элементами</strong>. Мы сокращаем вычисления, сводя заполнение "неугловых" ячеек простым<strong>инкрементированием</strong>.</p>
7
<p>Что ж, думаю, что этих вещей вполне достаточно для реализации задачи. На мой взгляд, главной изюминкой решения является<strong>идея с угловыми элементами</strong>. Мы сокращаем вычисления, сводя заполнение "неугловых" ячеек простым<strong>инкрементированием</strong>.</p>
8
<p>Я думаю, что в самой статье приводить листинг кода не нужно, а любой заинтересовавшийся может легко скачать код из<a>репозитория</a>.</p>
8
<p>Я думаю, что в самой статье приводить листинг кода не нужно, а любой заинтересовавшийся может легко скачать код из<a>репозитория</a>.</p>
9
<p>Использование<strong>класса Snail</strong>очень простое. Мы создаём новый объект и вызываем у него метод cookSnail(int $length), где$length` - это размерность квадратной матрицы.</p>
9
<p>Использование<strong>класса Snail</strong>очень простое. Мы создаём новый объект и вызываем у него метод cookSnail(int $length), где$length` - это размерность квадратной матрицы.</p>
10
<p>Текущая версия легко "готовит" и выводит "улитку" со стороной до 550 ячеек. Вот, собственно, и всё! Безошибочного вам кода!</p>
10
<p>Текущая версия легко "готовит" и выводит "улитку" со стороной до 550 ячеек. Вот, собственно, и всё! Безошибочного вам кода!</p>
11
11