Дискретка_Экзамен_Ответы / комб / 2 метод поиска с возвращением
.docx2.2. Метод поиска с возвращением
Пусть задача имеет множество решений, каждое из которых можно представить последовательностью R конечной, но, в общем случае, неопределённой длины, состоящей из элементов, принадлежащих некоторому множеству А, и требуется найти все решения задачи. Их можно найти, используя метод поиска с возвращением, который заключается в следующем.
Для получения одного решения будем последовательно, элемент за элементом, формировать последовательность R. Сначала определим подмножество элементов множества А, которые можно поставить на 1-ое место и один из них поставим на 1-ое место. Затем, по аналогии, будем определять и ставить элементы на 2-ое, 3-е и т.д. место, продвигаясь по последовательности R вперёд, т.е. делать шаги вперёд. Так, двигаясь вперёд, на некотором i-ом шаге мы либо получим одно из решений (случай 1), либо обнаружим, что во множестве А нет ни одного элемента, который можно поставить на очередное место, не нарушая условие задачи (случай 2). Случай 2 означает, что ни одно решение задачи не содержит в качестве первых i-1 элементов элементы, поставленные в последовательность R. В этой ситуации нужно сделать шаг назад, к i-1-му месту и попытаться поставить другой допустимый элемент на i-1-ое место. В случае 1, когда решение получено, для продолжения поиска других решений необходимо попытаться поставить другой допустимый элемент на i-ое место, а если такого элемента нет, то нужно сделать шаг назад. Если нужно выполнить шаг назад тогда, когда находимся на 1-ом месте в последовательности R, то поиск решений прекращается, все решения найдены.
Метод поиска с возвращением можно реализовать на ЭВМ, используя рекурсивный или итеративный алгоритмы, структуры которых представлены на рис.2.1 и рис.2.2 соответственно.
Поиск с возвращением(i)
Ri := x
М := множество элементов, которые можно поставить на i-ое место
xМ
Решение получено ?
+
Шаг вперёд к i+1
Поиск с возвращением(i+1)
R
Выход (шаг назад к i-1)
Рис.2.1. Рекурсивный алгоритм поиска с возвращением
Начало
Инициализация стека.
Множество элементов, которые можно поставить на 1-ое место, положить в стек.
i := 1
i > 0
М := взять из стека
M ≠
+
Ri := x | xM
M-{x} в стек
Решение получено ?
+
Шаг вперёд i := i+1
Множество элементов, которые можно поставить на i-ое место, положить в стек.
Шаг назад
i := i-1
R
Конец
Рис.2.2. Итеративный алгоритм поиска с возвращением
Рекурсивная подпрограмма формирует i-ый элемент последовательности R, поэтому при первом обращении к ней нужно передать параметр, равный 1.
Метод поиска с возвращением можно также использовать, если требуется определить, существует ли решение задачи, подсчитать количество возможных решений или найти одно из возможных решений.