![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
madrabbit |
![]() ![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Мужской Репутация: ![]() ![]() ![]() |
Здравствуйте.
Помогите пожалуйста с алгоритмом. хотя бы просто на пальцах или отправьте к соответствующим ссылкам. Интересует следующий алгоритм: Предположим задана некоторая матрица размерности N на N( положим поле больше шахматной доски), а также координаты двух точек(элементы массива a[i,j], b[i1,j1]), Задача. Найти оптимальный путь межды этими точками "шахматным конем". Решал так: забил всю матрицу нулями, два элемента - "1". функция проверки "не является ли элемент массива =1. Если нет, то в функцию передаются новые координаты(причем 8 различных точек, куда может шагнуть конь с текущего места). таким образом это приводит к многократному зацикливанию и росту рекурсивных вложений... посоветуйте принцип решения. каким способом, например, можно оборвать вложенную процедуру при приближении к краям поля. Ну и вообще... задач однотипных я знаю много. Интересует сам принцип и средства решения. Хотелось бы самому дойти, но видно опыта самоучки маловато... спасибо вам заранее за помощь! :molitva: Сообщение отредактировано: madrabbit - |
![]() ![]() |
madrabbit |
![]() ![]()
Сообщение
#2
|
Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Мужской Репутация: ![]() ![]() ![]() |
ВОПРОС! не пойму почему не получается. 8(
вроде правильно написано. но судя по результатам все действия просиходят на одной и той же матрице. Хотя по идее для каждой ветки рекурсии ДОЛЖНА определяться своя матрица! (не знаю, понятно ли объяснил) ну и пока я не дописал хранение промежуточных результатов. Проблема в том(как я уже писал), чтобы для каждого нового дерева бралась чистая матрица! Подскажите, в чем ошибка... Прикрепленные файлы ![]() |
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Цитата(madrabbit @ 29.01.05 14:11) Хотя по идее для каждой ветки рекурсии ДОЛЖНА определяться своя матрица! Тогда попробуй генерировать динамическую матрицу при каждом входе в рекурсию... Но вот хватит ли памяти... |
madrabbit |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата(volvo @ 17.02.05 15:38) Тогда попробуй генерировать динамическую матрицу при каждом входе в рекурсию... Но вот хватит ли памяти... так я так и делаю, каждый раз в рекурсию передается матрица, которая, как я понимаю, должна "копироваться по значению". Для каждой ветки. И как бы в памяти должно их быть какое-то количество. Но отсекая сразу результаты пути длиненнее или равные уже найденному, и периодически скоращая этот оптимальный путь мы достигаем разгрузки ресурсов сисетмы и избегаем необходимости полного обхода всего поля... |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата(madrabbit @ 18.02.05 0:16) так я так и делаю, каждый раз в рекурсию передается матрица, которая, как я понимаю, должна "копироваться по значению". Ну так вот что я нашел: Код procedure recurse(var m:mass;i,j:integer); Это передача "по значению"? Тогда как передать "по ссылке"? Нет, madrabbit, тут как раз и происходит передача матрицы по ссылке, т.е. ВСЕ вызовы процедуры Recurse работают с одной и той же копией матрицы...Сразу хочу предупредить, что при попытке передать матрицу размером 100х100 по значению, переполнение стека наступит очень быстро... Единственное, что можно попробовать - Цитата генерировать динамическую матрицу при каждом входе в рекурсию... , то есть не в стеке, а в динамической памяти...Удачи... |
madrabbit |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата(volvo @ 18.02.05 1:29) Ну так вот что я нашел: Код procedure recurse(var m:mass;i,j:integer); Это передача "по значению"? Тогда как передать "по ссылке"? Нет, madrabbit, тут как раз и происходит передача матрицы по ссылке, т.е. ВСЕ вызовы процедуры Recurse работают с одной и той же копией матрицы...Сразу хочу предупредить, что при попытке передать матрицу размером 100х100 по значению, переполнение стека наступит очень быстро... Единственное, что можно попробовать - , то есть не в стеке, а в динамической памяти... Удачи... спасибо. я приблизительно это и имел ввиду. А именно: "Как передавать матрицу по значению???" а переполнения не должно быть, так как сразу после нахождения первого удачного варианта, все более длинные ветки будут рубиться, а каждый более коротнкий путь будет браться за образец, пока мы не найдем самый оптимальный... Вопрос, как именно передавать матрицу или формировать новую... |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата(madrabbit @ 18.02.05 17:50) "Как передавать матрицу по значению???" Код Type matrix = array[1 .. 100] of integer; var mx: matrix; procedure p1(var x: matrix); begin end; procedure p2(x: matrix); begin end; begin p1(mx); { по ссылке } p2(mx); { по значению } end. Цитата(madrabbit @ 18.02.05 17:50) а переполнения не должно быть, так как сразу после нахождения первого удачного варианта, все более длинные ветки будут рубиться, а каждый более короткий путь будет браться за образец... Вся проблема в том, что стек (по умолчанию) ограничен 16К, а передача матрицы целых размером 100х100 = 20000 байт ... и что будет? |
![]() ![]() |
![]() |
Текстовая версия | 8.09.2025 3:22 |