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