![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Andrej_87 |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
ЛЮДИ ОТКЛИКНИТЕСЬ!!! Помогите пожалуйста с задачей. Не могу написать его на паскале. Имеется алгоритм
Матрица размера N*M определяет некоторый лабиринт. B матице элемент 1 обозначает стену, а 0 определяет свободное место. В первой строке матрицы определяются входы x(i), а в последней выходы y(i), i=1,..,k, которые должны быть нулевыми элементами. Необходимо определить, можно ли а) провести k человек от входа x(i) до выхода y(i) соответственно, i=1,..,k, таким образом, чтобы каждое свободное место посещалось не более одного раза. б) то же, но человека можно выводить чеpез любой из выходов. Примечание: Движение в лабиринте осуществляется только по вертикали или горизонтали. Алгоритм: Основная стратегия человека, вошедшего в самый левый вход, состоит в прохождении лабиринта, используя наиболее левые свободные места лабиринта, т.е. он должен двигаться, держась правой рукой за "стенку" лабиринта. Этот процесс можно формализовать следующим образом. Находясь в очередной позиции лабиринта, он должен помнить, с какой стороны он пришел сюда (слева, справа, сверху, снизу), и, руководствуясь этой информацией, вобрать следующее наиболее предпочтительное направление в новую позицию (куда он может пойти и где еще не был). При этом удобно использовать стек, в верхушке которого находятся координаты текущей позиции и направление, по которому в нее пришли. При этом все посещенные клетки метятся. Легко заметить, что если в позицию попали сверху, то наилучшим направлением будет налево, затем вниз, направо, и наконец назад (вверх). Аналогично можно определить наилучшие направления для других случаев. Эта стратегия повторяется каждым из людей, при этом позиции, помеченные предыдущими людьми, считаются запрещенными для следующих. |
![]() ![]() |
Connected |
![]()
Сообщение
#2
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
Возможно, это тебе поможет:
http://tpxexe.narod.ru/020.html Сообщение отредактировано: Connected - 19.03.2007 21:12 |
Andrej_87 |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо!! Это хоть что-то! Но мне по заданию нужно провести k человек от входа x(i) до выхода y(i) соответственно, i=1,..,k, таким образом, чтобы каждое свободное место посещалось не более одного раза.
|
Connected |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
К сожалению, я больше ничего подсказать не в силах..
|
Lapp |
![]()
Сообщение
#5
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Задачка меня заинтересовала - я вообще питаю слабость к лабиринтам..
![]() Сначала - видимо, у тебя опечатка: .. он должен двигаться, держась правой рукой за "стенку" лабиринта. 1. Повернуться налево и попробовать идти. 2. Если не получается, то повернуться направо. 3. Если снова не получается - перейти к п.2 Вот и весь алгоритм. Повороты векторов тривиально делаются обычной матрицей поворота с синусами/косинусами, только тут она состоит из единиц, нулей и минус единиц.. Выкладываю программу прохождения, которую я сваял на скорую руку. Повороты реализованы процедурой. Шаг - тоже (только для ясности). Данные берутся из файла и выглядят примерно так (мой тестовый файл): 1101111110111111111011111111101111111111 Размеры определяются автоматически из файла. Заметьте, что собственно лабиринт тут окружен бордюром шириной 1 символ. Это значит, что на вертикальных краях нулей встречаться не должно, нули на верхней кромке представляют входы (вместо массива X(i) ), а нули на нижней кромке - выходы (вместо массива y(i) ). Это все надо записать в файл с названием Labyrinth_0_0.dat При выводе я уделил достаточное внимание наглядности ![]() Далее сама прога.. uses -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Гость |
![]()
Сообщение
#6
|
Гость ![]() |
Большое спасибо!!!
|
NTL |
![]()
Сообщение
#7
|
![]() Фанат Delphi ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Lapp, гениально
![]() -------------------- ICQ (384-043-857)
|
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 2:59 |