Добрый вечер! Сразу к задаче: Требуется найти последовательность чисел минимальной длины, обладающую нужными свойствами.
Ещё со школы помню очень простой алгоритм рекурсивного поиска для аналогичных задач:
void step(int n)
{ ...
for(i=0; i<k; i++) {... step(n+1) ...}
...
}
В википедии прочитал, что это называется поиском в глубину. Однако для моей задачи этот алгоритм, очевидно, не годится. Даже если заранее известно, что существует короткое решение (и даже что их очень много), то рекурсия почти всегда уходит в бесконечность, потому что решений на, например, самых левых листьях может просто не быть. И даже если добавить кучу ограничений для завершения рекурсии, она всё равно может уйти очень далеко по "неперспективным" веткам. Немного поразмыслив, я пришел к выводу, что нужно перебирать не обычным способом (всегда самую левую вершину), а по возрастанию глубины. Берем корень, потом перебираем все узлы первого поколения, потом второго и т.д. Тогда минимальное решение найдется гораздо быстрее (заранее известно, что оно существует).
В википедии прочитал, что это называется поиском в ширину. Прошу помощи в реализации. Не очень представлю, как бы это применить к данной задаче. Хочется чего-нибудь изящного и короткого.