Лабиринт, ПОмогите пожалуйста с лабиринтом |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Лабиринт, ПОмогите пожалуйста с лабиринтом |
keng |
Сообщение
#1
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Реальное имя: Андрей Репутация: 0 |
Здравствуйте!Помогите пожалуйста с курсовым по Паскалю!Задание примерно состоит в том чтобы сделать программу которая ищет выход из лабиринта.Самому простейшему варианту буду очень рад(желательно с комментариями)Заранее спасибо!
PS Очень оЧЕНЬ надо А я в Паскале не бум бум) |
TarasBer |
Сообщение
#2
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
1. Изучи основы Паскаля (время у тебя есть).
2. Изучи алгоритмы обхода лабиринта, в твоей задаче нужен поиск в ширину. -------------------- |
Lapp |
Сообщение
#3
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
сделать программу которая ищет выход из лабиринта.Самому простейшему варианту буду очень рад(желательно с комментариями) keng, давай начнем с описания лабиринта. Уточни - какой он? Двумерный? На квадратной сетке? Есть у тебя хоть какие-то наработки или соображения? Высказывай, anything would do. Когда уточнишь условия, можно будет начинать решать. Ты не бойся, Pascal не кусается )). Давай вместе делать. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
keng |
Сообщение
#4
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Реальное имя: Андрей Репутация: 0 |
keng, давай начнем с описания лабиринта. Уточни - какой он? Двумерный? На квадратной сетке? Есть у тебя хоть какие-то наработки или соображения? Высказывай, anything would do. Когда уточнишь условия, можно будет начинать решать. Ты не бойся, Pascal не кусается )). Давай вместе делать. Мой руководитель практики просто сказал что моя тема выход из лабиринта!!!я спросил и что именно делать он сказал напиши программу которая ищет выход!одним словом пофиг еиу чо и что главное чтобы работала и чтобы я смог это объясить!ПРимерно нужно самую простейшую программу!Можетет решить?! |
TarasBer |
Сообщение
#5
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Ну на один вопрос ты ответил, ладно.
Остался второй: > Есть у тебя хоть какие-то наработки или соображения? Высказывай, anything would do. Ответ "я нифига не шарю помогите надо" не принимается. Короче, бери книгу (я советую http://win-web.ru/itbooks/open/faronov_tpaskal.html), читай, разбирайся, время есть, не торопись, не нервничай. Будет что непонятно - спрашивай. Только не так, что "сделайте за меня", тут так не принято. -------------------- |
keng |
Сообщение
#6
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Реальное имя: Андрей Репутация: 0 |
У меня есть некоторые мысли но нужно в одну их собрать(может кто поможет
Например, данный лабиринт можно описать в разделе CONST (описания констант) следующим образом: const lab: array[0..6,0..6] of byte = ((0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 1, 0, 0, 0), (0, 1, 1, 1, 1, 1, 0), (0, 0, 1, 0, 0, 1, 0), (0, 1, 1, 1, 1, 1, 0), (0, 1, 1, 0, 1, 1, 0), (0, 0, 0, 0, 0, 0, 0)); Путь можно хранить в двумерном массиве, например way: array[1..200,1..2] of integer; Рекурсивная процедура выглядит примерно так: procedure find(x,y: integer); begin if (x=xk)and(y=yk) then begin writeln; writeln('there is a way'); readkey halt end; lab[x,y]:=2; if lab[x+1,y]=1 then find(x+1,y); if lab[x-1,y]=1 then find(x-1,y); if lab[x,y-1]=1 then find(x,y-1); if lab[x,y+1]=1 then find(x,y+1); lab[x,y]:=1 end; Никак не могу это все объеденитьь!ПОмогите пожадуйста мне уже завтра сдавать((( |
TarasBer |
Сообщение
#7
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Надо дописать в начало процедуры вот это, иначе будет зависон: if lab[x,y] <> 1 then Exit;
И это сейчас у тебя обход в глубину, он не самый оптимальный. Также советую тебе сделать find не процедурой, а функцией, чтобы он возвращал длину найденного пути до выхода (или -1, если нет прохода). То есть тебе придётся сделать так:
процедура ChangeIfLess такая:
Ещё осталась проблема в том, чтобы он записывал длину в путь. Мы знаем, что для клетки (x,y) длина пути равна N. Тогда очевидно, что надо идти в клетку, для которой длина пути равна N-1. В общем, это кое-как работать будет, для размера 7 на 7 проканает. А вообще учи обход в ширину. > ПОмогите пожадуйста мне уже завтра сдавать((( На осень, что ли, долги оставил? Сообщение отредактировано: TarasBer - -------------------- |
keng |
Сообщение
#8
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Реальное имя: Андрей Репутация: 0 |
Да оставил если не сдам отчислят((
А как это все оформить чтоб заработало!?ПОжалуйста выручите блиин очень важно |
TarasBer |
Сообщение
#9
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Ну пишешь всё это и в конце пишешь
> ПОжалуйста выручите блиин очень важно А весной это почему-то не было важным, да? Ты где был полгода, если ты > в Паскале не бум бум ? -------------------- |
keng |
Сообщение
#10
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Реальное имя: Андрей Репутация: 0 |
uses wincrt; ВОт код! ..N..**...K **.**...... ...*..*.... ...*****... **........* вот то что в файле но он не может найти фаил!что делать?!?! |
Гость |
Сообщение
#11
|
Гость |
uses Это просто Гениальный лабиринт Lapp'a!МОжет кто нибудь описать что тут и как поисходит?!(что делают процедуры,и как самм программа работает)в каждой строчке)Я попробую сделать свой на подобие этого пожалуйста! |
Lapp |
Сообщение
#12
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Я попробую сделать свой Ловлю на слове ). Я думаю, можно даже упростить для начала. Если сделать только самое главное, прога будет вдвое меньше. И понять ее будет проще. Хорошо, я помогу. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Lapp |
Сообщение
#13
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
На всякую гениальную программу найдется еще более гениальная! - (С) Lapp ))
Вот, набросал еще один вариантик простейшего лабиринта (главным образом потому, что лень было разбираться с тем)). На квадратной сетке, каждая ячейка есть либо стена, либо свободное пространство. Фомируется случайным образом с заданной плотностью стен. Принцип - правило одной руки (будем считать - левой). Реализовано оно тут примерно так. Лабиринт - это массив m на n. Начальные значения задаются так: 0 - свободное пространство (а также - счетчик, сколько раз были на этой клетке). Wall (тут равно 8) - стена. При прохождении "свободное пространство" принимает значения от 0 до 4, увеличиваясь при каждом заходе на клетку. Суть в том, что если мы заходим на некоторую клетку более 4 раз (на самом деле, это может случиться только с начальной клеткой) - это значит, что лабиринт непроходим (т.к. мы уже перебрали все четыре пути, ведущие из нее). Вот алгоритм: 1. Сначала входим на начальную клетку (она должна быть свободной) с произвольного направления (его можно выбирать случайно, но у меня просто постоянное). 2. Поворачиваемся налево. 3. Делаем шаг вперед. 4. Если оказались внутри стены (не пугайся, можешь считать, что ходишь по нарисованному лабиринту)), то поворачиваемся назад и переходим к п.3. 5. Если оказались в на свободном пространстве - проверяем, не финиш ли это (B). 6. Если финиш - подготавливаем сообщение и выходим из цикла. 7. Если не финиш - смотрим, сколько раз тут были (значение массива). 8. Если уже были тут 3 раза (то есть пришли в четвертый раз) - значит, лабиринт непроходим (подготавливаем сообщение и выходим из цикла). 9. Если меньше 3 раз, то увеличиваем значение массива. 10. Переходим к п.2 При плотности заполнения 35% получаются довольно интересные конфигурации иногда )). Вот, например, конфигурация непроходимая: Running "c:\...\pas\fp\fp110911_keng\fp110911_keng_lapp-3.exe " - мы тут описали полный круг и вернулись в точку входа А. А вот эта - проходимая, заканчивается в B. Довольно интересный случай, советую проследить детально )). Running "c:\...\pas\fp\fp110911_keng\fp110911_keng_lapp-3.exe " А вот код. Пока без комментов )). Давай договоримся так: попробуй сначала разобраться сам (используя алгоритм, приведенный выше). Можешь сделать свои комменты - я посмотрю, правильно или нет. Если не сможешь разобраться - задавай вопросы. // The Simplest Maze Ever -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
keng |
Сообщение
#14
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Реальное имя: Андрей Репутация: 0 |
Все таки вот этот меня зацепил чем то)Я попробывал прокоментировать :
Люди помогите разобраться очень хочеться)))я конечно понимаю что половина моих коментариев полный бред прошу не судить строго)) |
TarasBer |
Сообщение
#15
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> //дир в будующем является const
Чего? Процедура Turn сделана по аналогии с процедурой обмена двух чисел:
Только в ней ещё и множитель ввели. Короче, просто прогони эту процедуру для dir=1 и для dir=-1, и всё будет понятно:
Для dir=1 у нас получется (x,y) -> (y,-x) это поворот против часовой стрелки Для dir=-1 получается (x,y) -> (-y,x) это поворот по часовой стрелке -------------------- |
keng |
Сообщение
#16
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Реальное имя: Андрей Репутация: 0 |
TarasBer Спасибо!Теперь это мне понятно!А как на счет остального!?)
|
Lapp |
Сообщение
#17
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Послушай, keng, это же совсем (ну, хорошо, не совсем - но весьма) другая задача! Зачем тебе она?
Говорю тебе, разберись с моей последней прогой. Комменты твои невпопад, извини уж. Все не смотрел, но поводу бордюров ты точно промахнулся - они включены в массив и обязаны быть в файле, так что беспокоиться о них совершенно нечего.. Разберись с последнй прогой. Сделай попытку, я поправлю. Давай. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Текстовая версия | 11.05.2024 11:59 |