Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построение матрицы, по количеству путей. 
:(
    Опции темы
IvanB
Дата 14.5.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



Извиняюсь, в центре помощи тему создавал, но ничего не получилось.... smile
Спросить здесь можно? smile

Задача была:
Цитата
Даны числа m, n, l, k. Построить матрицу m*n, из ячейки (1, 1) в ячейку (m, n) в которой ровно l путей. Из одной ячейки можно перейти в соседнюю (по стороне) только если разность чисел, стоящих в них меньше k.

Хоть направление подскажите, в котором копать..... smile 
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
neHb
Дата 14.5.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 10.5.2006

Репутация: нет
Всего: нет



Какие есть ограничения на m,n,l,k? 
PM MAIL   Вверх
IvanB
Дата 15.5.2006, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



Цитата(neHb @  14.5.2006,  17:10 Найти цитируемый пост)
Какие есть ограничения на m,n,l,k?  

Нет разницы. Нужен просто алгоритм. Скорее для небольших чисел. (<200 где-то) 
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
nostromo
Дата 15.5.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Постановка задачи до конца неясна:

1) При проверке возможности перехода, разность чисел берется по модулю, или между значениями в новой клетке и текущей?

2) Допустимы ли самопересечения пути? Есть варианты:
-- Наступать на клетку в которой побывали нельзя.
-- Пути могут самопересекаться, но с какими-то дополнительными ограничениями.
-- Двигаться можно только вправо или вверх (самый простой и удобный случай,
могу предложить алгоритм).

Добавлено @ 15:52 
3) 
Цитата
Скорее для небольших чисел. (<200 где-то)

Имеются в виду m, n? 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
IvanB
Дата 15.5.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



Цитата(nostromo @  15.5.2006,  15:49 Найти цитируемый пост)
1) При проверке возможности перехода, разность чисел берется по модулю, или между значениями в новой клетке и текущей?

Между значениями в новой клетке и в текущей.


Цитата(nostromo @  15.5.2006,  15:49 Найти цитируемый пост)
2) Допустимы ли самопересечения пути? Есть варианты:
-- Наступать на клетку в которой побывали нельзя.
-- Пути могут самопересекаться, но с какими-то дополнительными ограничениями.
-- Двигаться можно только вправо или вверх (самый простой и удобный случай,
могу предложить алгоритм).

Пути пересекаться не могут, т.к. из самопересечения следует бесконечность количества путей. smile

Цитата(nostromo @  15.5.2006,  15:49 Найти цитируемый пост)

Имеются в виду m, n? 

Да
 
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
nostromo
Дата 15.5.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Цитата
Пути пересекаться не могут, т.к. из самопересечения следует бесконечность количества путей. 


Правильно ли я понял, что в соседних клетках не могут стоять числа, скажем, 2, 3, если k=5? 
Путь на них зацикливается и, значит, в соседних клетках могут стоять только числа, разность по модуль между которыми не меньше k. 
Это так? 
PM MAIL   Вверх
IvanB
Дата 15.5.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



Цитата(nostromo @  15.5.2006,  16:32 Найти цитируемый пост)
Правильно ли я понял, что в соседних клетках не могут стоять числа, скажем, 2, 3, если k=5? 
Путь на них зацикливается и, значит, в соседних клетках могут стоять только числа, разность по модуль между которыми не меньше k. 
Это так?  

.......
Да.  smile 
  

Это сообщение отредактировал(а) IvanB - 15.5.2006, 16:50
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
nostromo
Дата 15.5.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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)$ ситуация заметно сложнее, причем очевидно, 
задача не всегда разрешима в принципе...




 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
IvanB
Дата 15.5.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



Цитата(nostromo @  15.5.2006,  17:15 Найти цитируемый пост)
3) Если есть клетка, для которой $A(i,j) = A(m,n) - l$, то записав в нее достаточно большое или достаточно малое число (что бы попав внее уже нельзя было выйти. Будем далее называть такие клетки заблокированными) мы получим искомое решение задачи.

Это понял. За это спасибо. smile


Цитата(nostromo @  15.5.2006,  17:15 Найти цитируемый пост)
Если забыть об условии, регулирующем возможность перехода из одной клетки в
другую и ограничиться только перемещениями вправо и вверх, то всего различных
путей получится $C(n+m, n)$ (биномиальный коэффициент).

А если ещё влево и вверх ходить можно. С право и вверх всё довольно очевидно получается. smile

Проблема в том, что поставили именно такую задачу.  smile   smile  
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
nostromo
Дата 16.5.2006, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Цитата
А если ещё влево и вверх ходить можно. С право и вверх всё довольно очевидно получается.

Проблема в том, что поставили именно такую задачу. 


Именно такую задачу я и решаю.
Прочитайте внимательнее то, что я написал. Сначала, как вспомогательная задача,
рассмотрен случай, когда можно перемещаться только вправо и вверх, а затем предложен алгоритм решения исходной задачи, единственным ограничением для работы которого является условие $l <= C(m+n, n)$. При тех типичных значениях m, n, которые Вы указали, это означает, что l может быть 50-значным числом, а значение k вообще не важно.
Вам этого мало?
 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
IvanB
Дата 16.5.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



Цитата(nostromo @  16.5.2006,  08:57 Найти цитируемый пост)
Прочитайте внимательнее то, что я написал. Сначала, как вспомогательная задача,
рассмотрен случай, когда можно перемещаться только вправо и вверх, а затем предложен алгоритм решения исходной задачи, единственным ограничением для работы которого является условие $l <= C(m+n, n)$. При тех типичных значениях m, n, которые Вы указали, это означает, что l может быть 50-значным числом, а значение k вообще не важно.
Вам этого мало?

Простите за невнимательность.
Насчёт ограничения C(m+n,n) уточню. 
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0669 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.