![]() |
|
![]() ![]() ![]() |
|
IvanB |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.5.2005 Где: Irkutsk Репутация: нет Всего: 5 |
Извиняюсь, в центре помощи тему создавал, но ничего не получилось....
![]() Спросить здесь можно? ![]() Задача была:
Хоть направление подскажите, в котором копать..... ![]() --------------------
Закон отладки: Каждая последняя ошибка является предпоследней. |
|||
|
||||
neHb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 10.5.2006 Репутация: нет Всего: нет |
Какие есть ограничения на m,n,l,k?
|
|||
|
||||
IvanB |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.5.2005 Где: Irkutsk Репутация: нет Всего: 5 |
Нет разницы. Нужен просто алгоритм. Скорее для небольших чисел. (<200 где-то) --------------------
Закон отладки: Каждая последняя ошибка является предпоследней. |
|||
|
||||
nostromo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
Постановка задачи до конца неясна:
1) При проверке возможности перехода, разность чисел берется по модулю, или между значениями в новой клетке и текущей? 2) Допустимы ли самопересечения пути? Есть варианты: -- Наступать на клетку в которой побывали нельзя. -- Пути могут самопересекаться, но с какими-то дополнительными ограничениями. -- Двигаться можно только вправо или вверх (самый простой и удобный случай, могу предложить алгоритм). Добавлено @ 15:52 3)
Имеются в виду m, n? --------------------
На пыльных тропинках далеких планет останутся наши следы. |
|||
|
||||
IvanB |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.5.2005 Где: Irkutsk Репутация: нет Всего: 5 |
Между значениями в новой клетке и в текущей. Пути пересекаться не могут, т.к. из самопересечения следует бесконечность количества путей. ![]() Да --------------------
Закон отладки: Каждая последняя ошибка является предпоследней. |
|||
|
||||
nostromo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
Правильно ли я понял, что в соседних клетках не могут стоять числа, скажем, 2, 3, если k=5? Путь на них зацикливается и, значит, в соседних клетках могут стоять только числа, разность по модуль между которыми не меньше k. Это так? |
|||
|
||||
IvanB |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.5.2005 Где: Irkutsk Репутация: нет Всего: 5 |
....... Да. ![]() Это сообщение отредактировал(а) IvanB - 15.5.2006, 16:50 --------------------
Закон отладки: Каждая последняя ошибка является предпоследней. |
|||
|
||||
nostromo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
Вот некоторые мысли.
Если забыть об условии, регулирующем возможность перехода из одной клетки в другую и ограничиться только перемещениями вправо и вверх, то всего различных путей получится $C(n+m, n)$ (биномиальный коэффициент). Это довольно много. Так $C(200,100) ~ 10^59$. Алгоритм для случая, когда $l <= C(n+m, n)$: 1). В клетку (i, j) записываем число $k*(n+m-i-j)$. Это гарантирует, что из каждой клетки можно перейти только правее или выше (разность влево и вниз всегда равна $k$, а вправо и вверх --- $-k$). 2). С каждой клеткой связываем число $A$, проходящих через нее путей. Его нетрудно оценить. Пусть B(x,y) --- число путей из клетки (1,1) в клетку (x,y). Очевидно, в данном случае оно удовлетворяет рекурсивному соотношению: $B(i,j) = B(i-1,j) + B(i,j-1)$, что позволяет эффективно его вычислить. Тогда $A(i,j) = B(i,j) * B(m-i+i, n-j+1)$. 3) Если есть клетка, для которой $A(i,j) = A(m,n) - l$, то записав в нее достаточно большое или достаточно малое число (что бы попав внее уже нельзя было выйти. Будем далее называть такие клетки заблокированными) мы получим искомое решение задачи. 4) Если нет клетки, для которой $A(i,j) = A(m,n) - l$, то можно итеративно блокировать по одной клетки (стоит попробовать начинать с наименьших начений $A(i,j)$), пересчитывать в получившейся таблице значения $B(i,j), A(i,j)$ и искать подходящую клетку ($A(i,j) = A(m,n) - l$). Алгоритм не гарантирует решение задачи при всех значениях параметров, но, возможно, окажется полезным. В случае, если $l > C(n+m, n)$ ситуация заметно сложнее, причем очевидно, задача не всегда разрешима в принципе... --------------------
На пыльных тропинках далеких планет останутся наши следы. |
|||
|
||||
IvanB |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.5.2005 Где: Irkutsk Репутация: нет Всего: 5 |
Это понял. За это спасибо. ![]() А если ещё влево и вверх ходить можно. С право и вверх всё довольно очевидно получается. ![]() Проблема в том, что поставили именно такую задачу. ![]() ![]() --------------------
Закон отладки: Каждая последняя ошибка является предпоследней. |
|||
|
||||
nostromo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
Именно такую задачу я и решаю. Прочитайте внимательнее то, что я написал. Сначала, как вспомогательная задача, рассмотрен случай, когда можно перемещаться только вправо и вверх, а затем предложен алгоритм решения исходной задачи, единственным ограничением для работы которого является условие $l <= C(m+n, n)$. При тех типичных значениях m, n, которые Вы указали, это означает, что l может быть 50-значным числом, а значение k вообще не важно. Вам этого мало? --------------------
На пыльных тропинках далеких планет останутся наши следы. |
|||
|
||||
IvanB |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.5.2005 Где: Irkutsk Репутация: нет Всего: 5 |
Простите за невнимательность. Насчёт ограничения C(m+n,n) уточню. --------------------
Закон отладки: Каждая последняя ошибка является предпоследней. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |