[Все темы по перестановкам]
Литература: Кнут. Том 4. Выпуск 2. Генерация всех картежей и перестановок. 2008
Задача: Футбол и математика
Описание решение:
Суть задачи решить ребус аналогичный такому:
MOTOR
+ FIAT
------
VOLVO
Где вместо букв нужно поставить цифру. При этом разные буквы должны иметь разные цифровые значения.
По условию задачи количество различных букв не превосходит 10.
Значит в общем случае нужно перебрать все размещения без повторений для n=10(10 цифр) и k = количеству различных букв в ребусе. А в худшем случае – 10! различных перестановок.
Генерация размещений без повторений имеет схожую природу с генерацией перестановок без повторений. Поэтому данная задача попала в блок к перестановкам.
Алгоритм будет иметь следующую структуру:
1) Получение строки, содержащей все различные буквы исходного ребуса в порядке слева направо, сверху вниз. Для примера это будет строка “MOTRFIAVL”.
1) Генерация текущего размещения без повторений для заданных n и k в лексикографическом порядке.
2) Т.к. длина текущего размещения равна длине строке различных букв из п.1), проинициализировать i-ую букву i-ым значением размещения.
3) Проверка корректности ребуса.
4) Если возможно, перейти на п. 1).
Реализация:
В самом решении использовалась рекурсивная схема, схожая со схемой генерации всех перестановок без повторений.
Обратите внимание на изящную реализацию считывания(ст.4):
- void input()
- {
- char a[12],b[12],c[12];
- scanf("%[A-Z]+%[A-Z]=%[A-Z]",&a,&b,&c);
- A = string(a); B = string(b); C = string(c);
- }
* This source code was highlighted with Source Code Highlighter.
[Решение]
P.S: Метод ветвей и границ для данной задачи.
Извините. Хотел сказать что ссылка с условием требует особой секретности, которой у меня нет ))
ОтветитьУдалитьДля это необходимо зарегистрироваться на сайте contester.tsure.ru, затем залогиниться и уже после этого нажать ссылку.
ОтветитьУдалитьЕсли не получится - пишите, поможем)