HTML Diff
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