100 likes | 255 Views
Алгоритмы с возвратом. Задача о 8 ферзях. Постановка задачи. Расставить на шахматном поле nxn n ферзей так, чтобы они не били друг друга. Для поясняющего примера пусть n=4. Соглашения при решении задачи. Каждый ферзь перемещается в пределах одной вертикали, т.е. №ферзя=№вертикали
E N D
Алгоритмы с возвратом Задача о 8 ферзях
Постановка задачи • Расставить на шахматном поле nxn n ферзей так, чтобы они не били друг друга. • Для поясняющего примера пусть n=4
Соглашения при решении задачи • Каждый ферзь перемещается в пределах одной вертикали, т.е. №ферзя=№вертикали • Положение n-го ферзя достаточно фиксировать как № горизонтали, на которую он поставлен. • Результат расстановки ферзей можно сохранять в одномерном массиве, где • № элемента=№ ферзя. • Значение n-го элемента массива =положению n-го ферзя на горизонтали
Расставляем ферзейПоследовательно проследите за действиями на поле: да – ставим ферзя, нет – ферзь под боем 2-нет 3-нет 2-нет 3-нет 3-нет 2-да 3-нет
Расставляем ферзейПоследовательно проследите за действиями на поле: да – ставим ферзя, нет – ферзь под боем 4-нет 2-нет 3-нет 2-нет 4-нет 3-да 2-дальше 4-нет 2-да 4-нет
Расставляем ферзейПоследовательно проследите за действиями на поле: да – ставим ферзя, нет – ферзь под боем 2-нет 3-нет 2-нет 3-дальше 2-дальше 3-нет 2-да 3-нет
Расставляем ферзейПоследовательно проследите за действиями на поле: да – ставим ферзя, нет – ферзь под боем 2-нет 3-да 4-нет 1-дальше 2-нет 4-нет 1-да 2-нет 4-да 2-да
Расставляем ферзей Задание 1. Заполните одномерный массив результатов Rezult.
Описание алгоритма Для каждого i-го ферзя выполняются следующие действия : • Проходим в цикле по всем горизонталям. • Проверяем для каждой горизонтали gor, можно ли поставить i-го ферзя на данную горизонталь. Проверка идет с учетом уже поставленных ферзей. Задание 2. Запишите какие ферзи учитываются в проверке для постановки i-го ферзя? • Если i-ый ферзь может быть поставлен на горизонталь gor, делаем запись в массиве результатов: rezult[?]:=?Задание 3.Замените знаки вопросов на имена переменных. • Переход к расстановке следующего ферзя. Задание 4. Запишите, какой ферзь будет расставляться после i-го? Перед вами описание рекурсивной процедуры.
Программная реализация Const n=4; Var Rezult: array [1..n] of integer; Procedure Print;{вывод массива с результатом} Function Correct (g,v: integer): boolean;{функция проверки} Var i:integer; Begin Correct:=true; {можно ставить ферзя} For i:=1 to ……. Do If (…….) then Correct:=false; {нельзя ставить ферзя} End; Procedure Q(i);{рекурсивная процедура расстановки ферзя} Vargor: integer; Begin For gor:=1 to n do if Correct(…,…) then begin Rezult[…]:=…; Q(….); end; End; Begin {тело программы} Q(….); End. Задание 5. Запишите, фактический параметр, который указывается при первом вызове процедуры Q