У нас есть исходное состояние сейфа из 16 бит (0 — горизонтальный рубильник, 1 — вертикальный).
Манипуляции над сейфом так же описываются 16 битами (0 — соответствующий рубильник не трогаем, 1 — переключаем).
При переключении рубильника в процессе исполнения манипуляции так же переключаем биты состояния, соответствующие строке и столбцу этого рубильника в сейфе (эмулируем поведение игрушки).
Задача считается решенной, когда в результате манипуляций получаем значение состояния равное 0 (все рубильники горизонтальны).
Таким образом, нам нужно проверить всего 2^16 вариантов манипуляций (значения 0 — 65535).
Хм. Я пробовал предельно простой алгоритм. Выписываем координаты всех неправильных вентилей. Игнорируя текущее значение, нажимаем все выписанные вентили. Повторяем еще раз и все. Две итерации.
правильные — 0, неправильные — 1. Сумма строк и столбцов в точке пересечения вентиля четная — пропускаем. Нечетная — поворачиваем. ЕМНИП за один проход открывает.)
Интересно, если эту штуку соединить с наработками Блейза (его исследование "Safecracking for the computer scientist"), насколько сократится время вскрытия? Подозреваю, что можно будет успеть вскрыть холодильниксейф за ночь:)
Автоматический перебор комбинаций в механических сейфовых замках