Разбор от сообщества: Математика и алгоритмы в простой головоломке "Пятнашки".
«Пятнашки» — это не просто игрушка для разминки мозга. Для 1С-разработчика это идеальный полигон для проверки алгоритмического мышления: здесь есть нетривиальная математика, проблема комбинаторного взрыва и подводные камни, которые не заметны при поверхностном взгляде. Разбор сообщества на Infostart показывает, как простая головоломка вскрывает пласт вопросов: от критерия разрешимости до выбора стратегии поиска. Мы идём дальше пересказа — разбираем, почему наивные подходы умирают, как правильно считать инверсии и какие ловушки ждут вас при реализации на платформе 1С.
Контекст: почему «Пятнашки» стали популярной темой в 1С-сообществе
На первый взгляд, задача тривиальна: перемещать костяшки до целевого состояния. Но когда сообщество начинает обсуждать реализацию на 1С, выясняется, что 90% решений падают на тесте из 10 ходов. Проблема не в синтаксисе, а в алгоритме. Статья на Infostart — это не про «как сделать кнопку», а про то, как математика и структуры данных превращают игрушку в серьёзный вызов.
Что именно разбирают на Infostart
Автор показывает, что стандартный перебор всех состояний невозможен: для поля 4×4 число достижимых позиций — 16! / 2 ≈ 1013. Даже если хранить одно состояние в 16 байт, потребуется 160 терабайт. Поэтому ключевой вопрос — не «как перебрать», а «как отсечь заведомо недостижимые цели и сократить перебор». Здесь вступает в силу критерий разрешимости, который многие пропускают.
Математика: критерий разрешимости
Прежде чем писать поиск, нужно ответить на вопрос: а можно ли в принципе собрать данную позицию? Ответ даёт чётность числа инверсий. Инверсия — это пара костяшек, где большая стоит раньше меньшей (не считая пустую клетку). Для поля с нечётной шириной (3×3) головоломка разрешима тогда и только тогда, когда число инверсий чётно. Для поля с чётной шириной (4×4) добавляется условие на ряд пустой клетки: сумма числа инверсий и номера ряда пустой клетки (снизу) должна быть нечётной.
Реализация проверки на 1С
Функция ПроверитьРазрешимость(Поле, Размер) Экспорт
// Поле — массив чисел от 0 до Размер*Размер-1, где 0 — пустая клетка
// Размер — ширина/высота квадратного поля
Инверсии = 0;
ИндексПустой = -1;
Для Индекс1 = 0 По Поле.Количество() - 1 Цикл
Если Поле[Индекс1] = 0 Тогда
ИндексПустой = Индекс1;
Иначе
Для Индекс2 = Индекс1 + 1 По Поле.Количество() - 1 Цикл
Если Поле[Индекс2] <> 0 И Поле[Индекс1] > Поле[Индекс2] Тогда
Инверсии = Инверсии + 1;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если ИндексПустой = -1 Тогда
Возврат Ложь; // Нет пустой клетки — некорректное поле
КонецЕсли;
РядСверху = Цел(ИндексПустой / Размер) + 1;
РядСнизу = Размер - РядСверху + 1;
Если Размер % 2 = 1 Тогда
Возврат Инверсии % 2 =
Расширение «НОПик» для 1С — встраиваемый коннектор к внешнему AI с интеллектуальным поиском по базе. Задавайте вопросы обычными словами - AI сам найдёт нужное. 45 дней бесплатно.
Попробовать НОПик →
Знаете ответ на такие вопросы не хуже автора статьи? Пройдите бесплатную анонимную проверку уровня на infolimp.ru - 3 практических задачи, 15 минут, публичный токен-профиль, который можно показать работодателю или заказчику. Без регистрации по почте.
Проверить свой уровень бесплатно →