Опубликован: 08.04.2009 | Доступ: свободный | Студентов: 485 / 0 | Длительность: 17:26:00
Специальности: Программист
Лекция 3:

Обход дерева. Перебор с возвратами

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >

3.1. Ферзи, не бьющие друг друга: обход дерева позиций

В предыдущей лекции мы рассматривали несколько задач одного и того же типа: "перечислить все элементы некоторого множества A ". Схема решения была такова: на множестве A вводился порядок и описывалась процедура перехода от произвольного элемента множества A к следующему за ним (в этом порядке). Такую схему не всегда удается реализовать непосредственно, и в этой лекции мы рассмотрим другой полезный прием перечисления всех элементов некоторого множества. Его называют " поиск с возвратами ", " метод ветвей и границ ", " backtracking ". На наш взгляд, наиболее точное название этого метода - обход дерева.

3.1.1.Перечислить все способы расстановки n ферзей на шахматной доске n\times n, при которых они не бьют друг друга.

Решение. Очевидно, на каждой из n горизонталей должно стоять по ферзю. Будем называть k-позицией (для k =
0, 1,\ldots,n ) произвольную расстановку k ферзей на k нижних горизонталях (ферзи могут бить друг друга). Нарисуем "дерево позиций": его корнем будет единственная 0 -позиция, а из каждой k -позиции выходит n стрелок вверх в (k+1) -позиции. Эти n позиций отличаются положением ферзя на (k+1) -ой горизонтали. Будем считать, что расположение их на рисунке соответствует положению этого ферзя: левее та позиция, в которой ферзь расположен левее.

Дерево позиций для n=2

Дерево позиций для n=2

Среди позиций этого дерева нам надо отобрать те n -позиции, в которых ферзи не бьют друг друга. Программа будет "обходить дерево" и искать их. Чтобы не делать лишней работы, заметим вот что: если в какой-то k -позиции ферзи бьют друг друга, то ставить дальнейших ферзей смысла нет. Поэтому, обнаружив это, мы будем прекращать построение дерева в этом направлении.

Точнее, назовем k -позицию допустимой, если после удаления верхнего ферзя оставшиеся не бьют друг друга. Наша программа будет рассматривать только допустимые позиции.

Дерево допустимых позиций для n=3

Дерево допустимых позиций для n=3
< Лекция 2 || Лекция 3: 1234 || Лекция 4 >