Лабиринт. Генерация и поиск кратчайшего пути
Функциональное назначение программы Labirint, возможность выбора пользователем точки входа в лабиринт и точки выхода из него. Описание логической структуры, выбор способа решения задачи, сущность процедур и функций с использованием локальных переменных.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 26.11.2011 |
Размер файла | 487,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Чувашский государственный университет имени И. Н. Ульянова.
Кафедра вычислительной техники.
Тема: «Лабиринт. Генерация и поиск кратчайшего пути»
Работу выполнил:
студент группы
ИВТ-42-05
Тарасов Е.Э.
Руководитель:
Васильев Ю.Г.
Чебоксары 2006 г.
1. Задание
Лабиринт.
Написать программу нахождения кратчайшего пути в лабиринте. Предусмотреть генерацию лабиринта и возможность выбора пользователем точки входа в лабиринт и точки выхода из него. В программе предусмотреть использование мыши и разбиение на модули.
2. Функциональное назначение
Программа Labirint выполняет ряд следующих операций:
- генерация лабиринта;
- определение пользователем точки входа в лабиринт и точки выхода из него;
- нахождение кратчайшего пути от заданной пользователем точки входа в лабиринт до точки выхода и вывод пути на экран либо вывод на экран сообщения о том, что не существует пути между двумя выбранными пользователем локациями.
3. Описание логической структуры
3.1 Выбор способа решения задачи
Задача может быть решена несколькими способами:
1) организовать лабиринт с использованием записи:
В каждой локации лабиринта нас интересует информация о стенах/проходах. В локации может существовать от одной до четырех стен (сверху, снизу, слева и справа). Если значение поля равно true, значит, соответствующая стена существует, иначе - нет.
Прежде всего, создадим заготовку - лабиринт со всеми возможными стенами. Далее последуем алгоритму:
locations := количество локаций в лабиринте
ПОКА locations > 1
выбираем случайную стену в лабиринте
ЕСЛИ не существует пути между локациями, разделенными этой стеной, разбиваем стену
locations := locations - 1
КОНЕЦ ЦИКЛА
Находить путь между точкой входа и выхода можно по алгоритму метода волновой трассировки: Стартовую локацию пометим единицей (вылили кисель). Теперь выполняем действия.
Найти в лабиринте локации, помеченные единицами для каждой из четырех соседних с ней локаций проверить два условия:
помечена ли она нулем
есть ли стена между двумя локациями (выбранной и соседней) если оба условия выполнены, помечаем соседнее локацию двойкой.
Вторая итерация алгоритма выглядит так:
найти в лабиринте локации, помеченные двойками;
для каждой из четырех соседних с ней локаций проверить те же условия;
если оба условия выполнены, помечаем соседнею локацию тройкой и так далее.
2) задать лабиринт массивом:
Если на пересечении i-ой строки и j-ого столбца стена, то элемент массива с индексами i и j имеет значение 0, в противном случае 1.
Для генерации лабиринта был создан начальный массив a, состоящий из целых чисел:
0000000 0
0101010 0
0000000 … 0
0101010 0
0000000 0
… 0
00000000000
Далее генератором случайных чисел выбирается определенное число нечетных локаций в каждом четном ряду (кроме последнего) и им присваивается значение 1, в каждом нечетном ряду (кроме первого и последнего) определенному числу четных локаций присваивается значение 0. Далее пользователем вводятся координаты точки входа в лабиринт и точки выхода из него. Элементу массива, принятому за точку входа присваивается значение 3. Если соседние с ним локации пусты (то есть имеют значение 1), то им присваивается значение 3+1=4. Далее в Лабиринте ищутся все элементы, имеющие значение 4 и с ними производится та же процедура.
Выглядеть это будет примерно так:
0000000
0307090
0456780
0507800
0000000
Переменной d присвоим значение элемента массива, принятого за точку выхода, после нескольких циклов вышеуказанных операций, а затем присвоим ему значение 2. Далее проверяются все соседние с ним элементы. Если их значение равно d-1, то таким элементам присваивается значение 2, а значение переменной d уменьшаем на 1. Проделываем эту операцию со всеми элементами массива, равными 2, если это возможно.
Затем, для вывода результата на экран вводится массив символов b, такой же размерности как массив a. Если элемента a[i,j]=0, то соответствующему элементу массива b присваивается символ `0', если a[i,j]=2, то b[i,j]:='*' если a[i,j] не равно 0 или 2, то b[i,j]:=' `. Полученный массив выводится на экран.
Для решения данной задачи я выбрал второй способ, так как организация данных с помощью массива относительно проста и нет необходимости использовать более сложную структуру. Для выполнения задачи, а именно визуального представления сгенерированного лабиринта и пути от точки входа до точки выхода памяти хватает. Окно программы позволяет выводить лабиринты в приемлемом для пользователя виде с максимальным размером 25Ч80 элементов. Памяти же хватает для того, чтобы задать массив размерностью 146Ч146 символов, то есть, нет необходимости прибегать к более сложным структурам.
3.3 Структура данных
Наименование |
тип |
Назначение переменной |
Допустимые значения |
|
Ch |
символьный |
Хранит код нажатой клавиши пользователем |
0..255 |
|
what |
целый |
Регистрирует действия пользователя/обрабатывает события |
0,1,2 |
|
X Y |
целый |
Графические координаты точки по щелчку мыши |
0..640 0..480 |
|
ex |
целый |
Определяет координаты входа или выхода |
0..1 |
|
Key |
целый |
Определяет, перезапускать ли программу |
0,1 |
|
exist |
целый |
Определяет наличие лабиринта |
0..1 |
|
a[n][n] |
Массив |
Хранит лабиринт |
N=1..15 |
|
x_en, y_en /x_ex, y_ex |
Целые |
Координаты входа/выхода |
1..15 |
3.4 Описание процедур и функций (Все процедуры используют локальные переменные (описаны в п.3.3.))
Процедура GenLab
Процедура генерации лабиринта. Создает лабиринт определенной структура, а затем случайным образом разбивает определенное количество стенок лабиринта и выводит результат на экран. При не устраивающем пользователя результате позволяет повторно сгенерировать лабиринт.
Процедура OutLab
Процедура выводит лабиринт на экран.
Процедура Result
Процедура производит поиск пути между заданными локациями лабиринта с использованием выбранного алгоритма.
Процедура GetEvent
Позволяет получать программе команды с клавиатуры.
Процедура Event
Обрабатывает любое событие.
Процедура far Handler
Обработчик событий мышки.
Процедура CheckMouse
Определяет, есть мышка или нет.
Процедура Init
Инициализация экрана.
4. Вызов и загрузка
Программа не использует в ходе выполнения никаких дополнительных файлов. Для запуска программы необходим лишь сам файл программы Labirint.exe.
5. Выходные данные
При запуске программа выводит на экран приветствие и три окна: для генерации лабиринта, для комментария событий и для отображения результата выполнения программы.
По мере работы с программой в этих окнах отображается соответствующая информация.
6. Выводы по работе
Была разработана программа Labirint. Данная программа полностью выполняет поставленную перед ней задачу. Более того, в программе имеется защита от ряда ошибок пользователя при вводе данных. Имеется возможность многократного генерирования лабиринта до появления желаемого результата. Алгоритм действий довольно прост и понятен. В программе используется достаточно простые в работе структуры данных - массивы. Программа имеет интуитивно понятный интерфейс и выводит все необходимые для пользователя инструкции.
В дальнейшем программу можно усовершенствовать: вместо массивов организовать работу со списками, а также добавить возможность определения пользователем степени проходимости лабиринта, а так же возможность самостоятельно определять размеры генерируемого лабиринта. Так же можно усложнить алгоритм генерации лабиринта.
7. Приложение к пояснительной записке
7.1 Назначение программы
Программа Labirint выполняет ряд следующих операций:
- генерация лабиринта
- определение пользователем точки входа в лабиринт и точки выхода из него
- нахождение кратчайшего пути от заданной пользователем точки входа в лабиринт до точки выхода и вывод этого пути на экран либо вывод на экран сообщения о том, что не существует пути между двумя выбранными пользователем локациями.
7.2 Требования к запуску
Для запуска программы запустите файл Labirint.exe
При запуске программа выводит на экран приветствие и три окна: для генерации лабиринта, для комментария событий и для отображения результата выполнения программы.
Далее пользователю предлагается сгенерировать лабиринт или выйти из программы. Команды можно послать программе путем нажатия клавиш мыши либо с клавиатуры. В окне сгенерированный лабиринт появляется лабиринт. При повторном выполнение этой операции будет генерироваться новый лабиринт.
программа labirint пользователь локальный
В лабиринте пользователь мышкой отмечает локации входа и выхода. Данное событие регистрируется в окне комментариев, а в окне «Результат» выводится результат выполнения программы: указанный путь либо сообщение, что его не существует.
Размещено на Allbest.ru
Подобные документы
Разработка в среде Delphi программы "Поиск кратчайшего пути", которая создает лабиринт, находит кратчайший путь его прохождения и отображает его. Структура данных задачи и методы ее решения. Общая схема организации и взаимодействия модулей, их описание.
курсовая работа [86,5 K], добавлен 19.10.2010Исследование методов решения задачи о ходе коня. Описание алгоритмов для итеративной и рекурсивной программ. Генерация перестановок элементов по индексам. Построение эйлерова цикла на графе. Поиск кратчайшего пути на графе. Программная реализация задачи.
курсовая работа [411,6 K], добавлен 25.04.2013Описание алгоритмов поиска пути. Диаграмма объектов предметной области. Разработка структурной схемы. Проектирование интерфейса пользователя. Выбор и обоснование комплекса программных средств. Разработка пользовательского меню. Диаграмма компонентов.
курсовая работа [3,5 M], добавлен 10.04.2015Решение задачи на тему максимизации функций многих переменных. Описание метода дихотомии, его применение для решения нелинейных уравнений. Решение данной задачи с использованием метода покоординатного спуска. Составление алгоритмов, листинг программы.
курсовая работа [138,5 K], добавлен 01.10.2009Практическое использование алгоритмов для нахождения минимального пути в лабиринте. Разработка программы на языке С++ и в среде Visual C++. Основные способы поиска пути: метод волны и приоритетов. Описание разработанных функций и инструкция пользователя.
дипломная работа [54,3 K], добавлен 16.03.2012Разработка программы в среде Delphi для нахождения кратчайшего пути между стартом, лежащим в одной из вершин многоугольника, и финишем, находящимся на одной из сторон. Установка опорных точек, контроль целостности вводимых данных, методы решения задачи.
курсовая работа [778,8 K], добавлен 19.10.2010Математическая модель решения задачи коммивояжера. Поиск кратчайшего замкнутого пути обхода нескольких городов и возвращения в исходную точку. Описание программы и результатов ее тестирования. Основная форма программы после вывода конечных данных.
курсовая работа [603,3 K], добавлен 21.10.2012Алгоритм поиска по первому наилучшему совпадению на графе. Основные классы для поиска пути в лабиринте. Тестирование нахождения кратчайшего пути в лабиринте. Порядок обхода вершин. Тестирование поведения программы при отсутствии пути в лабиринте.
курсовая работа [888,7 K], добавлен 19.12.2013Организация входных и выходных данных для задачи нахождения общей точки для всех кругов на плоскости. Словесное описание действий и операций, выполняемых программой для получения конечного результата. Выбор технических и программных средств приложения.
курсовая работа [314,1 K], добавлен 30.06.2014Формирование на экране меню для выбора функций. Элементы пользовательского интерфейса. Описание внутренних переменных, входных и выходных данных языка программирования Си. Выбор пользователем функции. Создание программы "Список коммерческих банков".
курсовая работа [491,9 K], добавлен 17.03.2015