Как узнать
двумерная сетка, которую обходят в необычном порядке (спираль, диагонали, слои), поворачивают или отражают, или меняют на месте с O(1) доп. памяти: поворот, обнуление строк, «Жизнь», проверка судоку.
Как решать такие задачи
- Запиши, что меняется на каждом шаге: какой индекс движется, а какой стоит на месте.
- Описывай оставшуюся часть простыми границами: четыре границы для спирали, номер слоя для колец.
- После каждой стороны или прохода сужай границы и проверяй, что они не пересеклись, прежде чем идти дальше.
- Проверь матрицу 1 × n и n × 1: ошибки на единицу вылезают именно там.
Вариант: Поворот
То же, но таблицу поворачиваем на месте. Поворот раскладывается на два отражения, а каждое отражение — это обмен клеток парами, поэтому вторая таблица не нужна.
- Запиши формулой, куда идёт клетка, и найди отражения, из которых она складывается: транспонирование, разворот строк, разворот столбцов.
- Меняй пары так, чтобы каждую пройти один раз: при транспонировании — только клетки правее диагонали.
- Чтобы пометить строки и столбцы на месте (обнуление матрицы), храни пометки в первой строке и первом столбце, а то, был ли ноль в них самих, запомни отдельно.
- Если каждой клетке нужны старые значения соседей («Жизнь»), храни старое и новое состояние в одной клетке: 2 — была живой, стала мёртвой; 3 — была мёртвой, стала живой. Расшифруй вторым проходом.
Где встречается
- Картинки в памяти. Несжатую картинку обычно хранят одной длинной строкой пикселей, ряд за рядом. Пиксель в ряду y и столбце x лежит на месте y × ширина + x.
- NumPy. NumPy хранит таблицу как один ряд чисел плюс два шага: на сколько прыгать к следующей строке и к следующему столбцу. Транспонирование просто меняет шаги местами, данные не копируются.
- Поворот фотографий. jpegtran поворачивает JPEG на 90° без потери качества: транспонирует и отражает блоки, из которых состоит картинка, а не сжимает её заново.