#java #permutation #equation #backtracking #brute-force
#java #перестановка #уравнение #отслеживание возврата #перебор
Вопрос:
Для данной задачи мне предоставляются два числа, которые таким образом приведут к определенному результату:
num1 num2 = result
Однако эти числа будут «закодированы», так что, например, ввод может быть:
ab bc = acd
Числа могут иметь любую длину до 9 цифр.
Моя задача — создать эффективный метод, позволяющий определить, сколько возможных решений имеет каждый ввод, или если это невозможно.
Я решил эту проблему, создав класс с именем Number (в java), который имеет букву (тип char) и числовое значение (int), а затем я преобразовал каждое число в массив этого нового номера класса, чтобы я мог легко проверить их текущие значения.
Однако я не совсем уверен, как подойти к этой проблеме с возвратом.
Я знаю, что я должен начать сравнивать единицы из number1 и number2, затем десятки и так далее, на каждом «уровне» выбирая только те случаи, в которых сумма будет логичной, так, например, в приведенном выше примере для единиц b = 2 и c = 3 это будет толькоимеет смысл, если d = 5, и я мог бы отбросить все остальные случаи, в которых d!= 5 для этих двух ранее существовавших значений.
Мне сказали, что можно охватить все эти перестановки, используя только два цикла: один для циклического перебора возможных чисел [от 0 до 9] и один для охвата всех букв / переменных, но я не совсем понимаю, как это можно сделать!
Если бы мне пришлось это представить, я думаю, я мог бы думать об этом как
for cycle ( through "columns" from the rightmost up to the leftmost column of the shortest number)
for cycle( for numbers 0 to 9?)
но все же я не могу разобраться в этом подходе к предмету или в том, как я мог бы решить это с помощью рекурсии вместо этого, вся помощь в улучшении моего понимания очень ценится.
Комментарии:
1. Каковы ваши входные данные? Каков ваш результат? ваша проблема не ясна. Вы говорите, что число может состоять из 9 цифр, значит
a
ли это, что может быть1236548
?? Или буква равна цифре?2. @majid hajibaba: каждая буква представляет собой одну цифру. Уравнение может содержать до девяти букв в каждом операнде или сумме. Для OP: в прошлом я использовал грубую силу для решения проблем такого типа, потому что уравнение может содержать не более 10 разных букв, представляющих 0-9, и не более 27 полных букв (три целых числа 10 ^ 9). Вложенные циклы с крошечными числами выполняются быстро.
Ответ №1:
Вот один алгоритм, который должен работать.
Давайте возьмем ваш пример уравнения:
ab bc = acd
-
Определите количество уникальных символов в уравнении. В вашем примере это будет четыре (a, b, c, d).
-
Чтобы перебрать все возможности, мы собираемся создать цикл. Минимальное значение этого цикла равно 10 ^ 3 или 1000. Максимальное значение этого цикла равно 10 ^ 4 или 10000. Количество уникальных символов в уравнении определяет степени 10, которые вы будете использовать. Максимальный максимум равен 10 ^ 10, что больше, чем an
int
. Along
будет работать. -
Внутри итерации разделите индекс на N цифр. В вашем примере это будет 4 цифры. Поскольку мы выполняем итерации от 1000 до 9999 включительно (10 000 исключаются), все значения индекса будут иметь 4 цифры.
-
Убедитесь, что N цифр уникальны. Дубликатов нет. Это устранит большинство значений индекса в начале.
-
Подставьте цифры в уравнение и проверьте, действительно ли уравнение. Если это так, сохраните уравнение в a
List<String>
. -
Выведите
List
значения или решение не найдено после завершения итерации.