Газеты и журналы часто имеют загадочно-арифметические загадки вида:
SEND + MORE -------- MONEY --------
Цель здесь — присвоить каждой букве цифру от 0 до 9, чтобы арифметика работала правильно. Правила заключаются в том, что все вхождения буквы должны иметь одну и ту же цифру, и никакая цифра не может быть назначена более чем одной букве.
- Сначала создайте список всех персонажей, которых нужно назначить для передачи в Solve.
- Если все символы назначены, верните true если головоломка решена, иначе false
- В противном случае, рассмотрим первый неназначенный символ
- для (любой возможный выбор среди неиспользуемых цифр)
- Если все цифры были опробованы и ничего не работает, верните false, чтобы вызвать возврат
сделать этот выбор, а затем рекурсивно попытаться назначить остальных персонажей
если рекурсия прошла успешно, верните true
если! успешно, отмените назначение и попробуйте другую цифру
|
Приведенный выше алгоритм на самом деле имеет много общего с алгоритмом перестановок, он в значительной степени просто создает все схемы отображения символов и цифр и пробует каждую до тех пор, пока одна из них не будет выполнена или все не будут успешно опробованы. Для большой головоломки это может занять некоторое время.
Более умный алгоритм может учитывать структуру головоломки и избегать тупиковых путей. Например, если мы назначаем символы, начиная с одного места и двигаясь влево, на каждом этапе мы можем проверить правильность того, что у нас есть, прежде чем мы продолжим дальше. Это определенно усложняет код, но приводит к огромному повышению эффективности, делая гораздо более выполнимым решение больших задач.
Ниже псевдокод, в данном случае, имеет более особые случаи, но тот же общий дизайн
- Начните с изучения самой правой цифры самого верхнего ряда, с переносом 0
- Если мы находимся за самой левой цифрой головоломки, верните true, если нет переноса, иначе false
- Если мы в настоящее время пытаемся назначить символ в одном из дополнений
Если char уже назначен, просто вернитесь в строку ниже этой, добавив значение в сумму
Если не назначен, то- для (любой возможный выбор среди неиспользуемых цифр)
сделайте этот выбор и затем в строке под ним, в случае успеха, верните true
если! успешно, отмените назначение и попробуйте другую цифру - вернуть false, если не сработало назначение, чтобы вызвать возврат
- для (любой возможный выбор среди неиспользуемых цифр)
- Иначе, если попытаться назначить символ в сумме
- Если символ назначен и соответствует правильно,
повторить в следующем столбце слева с переносом, если успех вернет истину, - Если символ назначен и не совпадает, вернуть false
- Если символ не назначен и правильная цифра уже используется, верните false
- Если символ не назначен и правильная цифра не используется,
назначить его и повторить в следующем столбце слева с переносом, если успех вернет true - вернуть false, чтобы вызвать возврат
Источник:
http://see.stanford.edu/materials/icspacs106b/H19-RecBacktrackExamples.pdf
Рекомендуемые посты:
- C ++ программа для решения криптарифметических задач
- Сумма подмножеств всех подмножеств массива | O (2 ^ N)
- Сумма подмножеств всех подмножеств массива | НА)
- Сумма подмножеств всех подмножеств массива | О (3 ^ N)
- Напечатайте все перестановки строки без повторения, используя Коллекции в Java
- Лабиринт с N дверями и 1 ключом
- Подсчитайте количество способов добраться до места назначения в лабиринте
- Распечатать заданную матрицу в виде спирали, используя метод отслеживания направления
- Программа для генерации всех возможных действительных IP-адресов из заданной строки | Набор 2
- Крыса в лабиринте Проблема, когда разрешено движение во всех возможных направлениях
- Генерация всех перестановок строки, которые соответствуют заданным ограничениям
- Реализация задач коммивояжера с использованием BackTracking
- Найдите триплет такой, чтобы число узлов, соединяющих эти триплеты, было максимальным
- Печатать путь от корня ко всем узлам в полном двоичном дереве
0.00 (0%) 0 votes