Опубликован: 02.02.2011 | Уровень: для всех | Доступ: свободно
Лекция 37:

Алгоритм перебора с возвратом

< Лекция 36 || Лекция 37: 12 || Лекция 38 >

Лабораторная работа 36. Алгоритм перебора с возвратом

Цель работы: изучить рекурсивный алгоритм перебора с возвратом, научиться разрабатывать рекурсивную триаду и алгоритм перебора с возвратом при решении задач на языке C++.

При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе числовые данные, выполняет их обработку в соответствии с требованиями задания и выводит результат на экран. Для обработки данных необходимо реализовать рекурсивную функцию алгоритма перебора с возвратом. Ввод данных осуществляется с клавиатуры или из файла с учетом требований к входным данным, содержащихся в постановке задачи. Ограничениями на входные данные является допустимый диапазон значений используемых числовых типов в языке С++.

Теоретические сведения.

Ознакомьтесь с материалом лекции 36.

Задания к лабораторной работе.

Выполните приведенные ниже задания.

  1. На основе описания из Примера 1 лекции 36 решите задачу о нахождении всех расстановок n ферзей на шахматной доске размером nxn.
  2. Найдите количество всех расстановок ферзей на шахматной доске размером nxn.
  3. Найдите все основные расстановки ферзей на шахматной доске размером nxn.
  4. Решите задачу о рюкзаке. Имеется n предметов, пронумерованных числами от 0 до n-1, для каждого из которых известен набор масс m0,...,mn-1 и набор стоимостей s0,...,sn-1. Определите, какой набор предметов необходимо положить в рюкзак, чтобы его масса не превышала Q, а стоимость предметов была бы наибольшей.

Указания к выполнению работы.

Каждое задание необходимо решить в соответствии с изученным рекурсивным алгоритмом перебора с возвратом, реализовав программный код на языке С++. Перед реализацией кода каждой задачи необходимо разработать рекурсивную триаду в соответствии с постановкой задачи: выполнить параметризацию, выделить базу и оформить декомпозицию рекурсии. Рекомендуется воспользоваться материалами лекции 36, где подробно рассматриваются описание метода перебора с возвратом, примеры разработки рекурсивной триады и обоснование декомпозиции. Этапы рекурсивной триады необходимо отразить в математической модели к отчету, выполнив обоснование декомпозиции. Программу для решения каждого задания необходимо разработать методом процедурной абстракции, используя рекурсивные функции. Этапы сопроводить комментариями в коде. В отчете следует отразить результаты тестирования программ.

Следует реализовать каждое задание в соответствии с приведенными этапами:

  • изучить словесную постановку задачи, выделив при этом все виды данных;
  • сформулировать математическую постановку задачи;
  • выбрать метод решения задачи, если это необходимо;
  • разработать графическую схему алгоритма;
  • записать разработанный алгоритм на языке С++;
  • разработать контрольный тест к программе;
  • отладить программу;
  • представить отчет по работе.

Требования к отчету.

Отчет по лабораторной работе должен соответствовать следующей структуре.

  • Титульный лист.
  • Словесная постановка задачи. В этом подразделе проводится полное описание задачи. Описывается суть задачи, анализ входящих в нее физических величин, область их допустимых значений, единицы их измерения, возможные ограничения, анализ условий при которых задача имеет решение (не имеет решения), анализ ожидаемых результатов.
  • Математическая модель. В этом подразделе вводятся математические описания физических величин и математическое описание их взаимодействий. Цель подраздела – представить решаемую задачу в математической формулировке.
  • Алгоритм решения задачи. В подразделе описывается разработка структуры алгоритма, обосновывается абстракция данных, задача разбивается на подзадачи. Схема алгоритма выполняется по ЕСПД (ГОСТ 19.003-80 и ГОСТ 19.002-80).
  • Листинг программы. Подраздел должен содержать текст программы на языке программирования С++, реализованный в среде MS Visual Studio 2010.
  • Контрольный тест. Подраздел содержит наборы исходных данных и полученные в ходе выполнения программы результаты.
  • Выводы по лабораторной работе.
  • Ответы на контрольные вопросы.

Контрольные вопросы

  1. В чем проявляется рекурсивность метода перебора с возвратом?
  2. Почему полный метод перебора с возвратом гарантирует отыскание всех решений задачи?
  3. Как формируется рекурсивная база метода возвратной рекурсии?
  4. Какие классы задач сводятся к разработке детерминированных алгоритмов, а какие – к недетерминированным? Поясните примерами.
  5. Поясните, почему данные описания характеризуют описание действий над ферзем в контексте модели шахматной доски:
    • В позицию (i,j) можно поставить ферзь, если hoi+dui+j+ddn+i-j=0.
    • Поставить ферзь в позицию (i,j) равносильно присваиваниям: hoi=1, dui+j=1, ddn+i-j=1.
    • Убрать ферзь из позиции (i,j) равносильно присваиваниям: hoi=0, dui+j=0, ddn+i-j=0.
< Лекция 36 || Лекция 37: 12 || Лекция 38 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!