Я тренируюсь на предстоящем конкурсе программистов ACM через неделю, и я натолкнулся на эту проблему программирования.
Проблема заключается в следующем:
У вас есть головоломка, состоящая из квадратной сетки размера 4. Каждый квадрат сетки содержит одну монету; каждая монета показывает либо головки (H), либо хвосты (T). Одна такая головоломка показана здесь:
H H H H
T T T T
H T H T
T T H T
Любая монета, текущая, показывающая Tails (T), может быть перевернута в Heads (H). Однако, всякий раз, когда мы переворачиваем монету, мы также должны перебрасывать соседние монеты прямо сверху, снизу и слева и справа в том же ряду. Таким образом, если мы перевернем вторую монету во второй строке, мы также должны перевернуть еще 4 монеты, предоставив нам эту организацию (измененные монеты выделены жирным шрифтом).
H T H H
H H H T
H H H T
T T H T
Если монета находится на краю головоломки, значит, нет монеты с одной стороны или другой, тогда мы переворачиваем меньшее количество монет. Мы не "обворачиваем" другую сторону. Например, если мы перевернули нижнюю правую монету вышележащей надстройки, мы получим:
H T H H
H H H T
H H H H
T T T H
Примечание. Для переворота можно выбрать только монеты, показывающие (T) хвосты. Однако в любой момент, когда мы переворачиваем такую монету, смежные монеты также переворачиваются независимо от их состояния.
Цель головоломки состоит в том, чтобы все монеты отображали головы. Хотя некоторые аррагнезии не могут иметь решений, все проблемы будут иметь решения. Ответ, который мы ищем, для любой данной 4x4 сетки монет - это наименьшее количество флип, чтобы сделать сетку целиком.
Например, сетка:
H T H H
T T T H
H T H T
H H T T
Ответ на эту сетку: 2 флип.
Что я сделал до сих пор:
Я храню наши решетки в виде двумерного массива булевых. Heads = true, tails = false. У меня есть метод flip (int row, int col), который будет переворачивать смежные монеты согласно приведенным выше правилам, и у меня есть метод isSolved(), который определит, будет ли головоломка находится в разрешенном состоянии (все головы). Итак, у нас есть наша "механика".
В части, с которой мы сталкиваемся, есть вопрос о том, как мы должны проходить цикл, занимая наименьшее количество раз глубоко?