powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите решить задачку
25 сообщений из 43, страница 1 из 2
Помогите решить задачку
    #36819615
dimbasbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дана матрица (размерность может быть любая) заполненная числами.

Код: plaintext
1.
2.
3.
4.
5.
   A     B     C     D     E 
 1 )  4       5       3       6       7 
 2 )  6       10     11      15       0  
 3 )  5       3       6       7       8 
 4 )  5       1       3       6       7 
При переходе из одной ячейки в другую - числа этих ячеек суммируются. Как дойти из ячейки A1 в E4 чтобы сумма была минимальной и наоборот ?
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36819786
OZKA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimbasbearПри переходе из одной ячейки в другую - числа этих ячеек суммируются. Как дойти из ячейки A1 в E4 чтобы сумма была минимальной и наоборот ?

В лоб: перебором всех путей и суммой получающейся в процессе каждого пути. Университетов не заканчивали, так что о возможном математическом методе можем и не знать...
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36819921
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алгоритм Дейкстры или Priority-First-Search (что то же самое).
Далее -- google/wikipedia, что больше нравится.
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36820164
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimbasbear,

строишь рекурсивную функцию, каторая проверяет путь через все соседние клетки самой себя. И возращаешь пару: путь и сумма.
зы. это без математики, самый банальное 20 строчное решение.
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36820452
dimbasbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не могли бы вы привести конкретный пример на любом из языков, например pascal
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36820565
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конечно .
Пожалуйста.
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36821289
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще бы уточнить - путь строится любом направлении, или только вправо/вниз/(вправо-вниз)?
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36821489
dimbasbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTMЕще бы уточнить - путь строится любом направлении, или только вправо/вниз/(вправо-вниз)?

Строиться может в любом направлении важно чтобы когда добрался до конечной точки сумма была максимальной или минимальной :)
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36821771
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже мы имеем дело с графом, у которого "веса" стоят на вершинах. Для Дейкстры надо будет сделать перерасчёт.
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36821958
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonПохоже мы имеем дело с графом, у которого "веса" стоят на вершинах. Для Дейкстры надо будет сделать перерасчёт.
Он же тривиален и делается "на лету".
Хотя может быть сделан, кстати, двумя разными способами (считать весом дуги вес вершины, для которой она является исходящей или для которой она является входящей), которые будут давать один и тот же результат (маршрут).

Что-то в этом роде на питоне:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
import heapq

data = [[ 4 ,   5 ,   3 ,   6 ,   7 ],
        [ 6 ,  10 ,  11 ,  15 ,   0 ],
        [ 5 ,   3 ,   6 ,   7 ,   8 ],
        [ 5 ,   1 ,   3 ,   6 ,   7 ]]

H = len(data)
W = len(data[ 0 ])
v = set()
pq = []
heapq.heappush(pq, ( 0 , ( 0 ,  0 ), []))
while pq:
    l, c, p = heapq.heappop(pq)
    if c == (W -  1 , H -  1 ):
        break
    v.add(c)
    for dy in xrange(- 1 ,  2 ):
        for dx in xrange(- 1 ,  2 ):
            x, y = c[ 0 ] + dx, c[ 1 ] + dy
            if x <  0  or y <  0  or x >= W or y >= H or dx * dy !=  0 :
                continue
            if (x, y) in v:
                continue
            heapq.heappush(pq, (l + data[y][x], (x, y), p + [c]))

p.append(c)
print "Best path: %s" % " -> ".join(map(str, p))
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36822224
Это, блин, азбука (см.). С гарантией делается ТОЛЬКО прямым перебором. Любая эвристика дает только наиболее вероятный путь.
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36822238
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УнрегистередЭто, блин, азбука (см.). С гарантией делается ТОЛЬКО прямым перебором. Любая эвристика дает только наиболее вероятный путь.
Чушь сказал. Ты хоть понял что мы говорим об Алгоритме Дейкстры? Какие прямые переборы?
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36823455
Прошу прощения. Невнимательно прочел исходный пост, показалось, что речь идет о максимальной сумме.
Для минимальной суммы (если значения неотрицательны) действительно будет работать алгоритм Дейкстры. И вообще любой рекурсивный алгоритм, выбирающий соседний элемент с меньшим весом.
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36823493
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Унрегистеред,
Любая задача максимизации однозначной функции может быть переформулирована в задачу минимизации другой однозначной функции; решения этих задач (точки оптимума) будут совпадать. Это же очевидно.
"F(x) -> max" эквивалентно "G(x) = -F(x) -> min"
В данной задаче достаточно приписать минус ко всем числам в матрице. Или переопределить оператор сравнения элементов priority queue (для c++/c#/java).
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36823549
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junior idiot
Код: plaintext
1.
2.
3.
data = [[ 4 ,   5 ,   3 ,   6 ,   7 ],
        [ 6 ,  10 ,  11 ,  15 ,   0 ],
        [ 5 ,   3 ,   6 ,   7 ,   8 ],
        [ 5 ,   1 ,   3 ,   6 ,   7 ]]

Я тут прикинул на глаз. Оптимальный путь должен быть (для 4-х связных соседей) примерно такой:

Код: plaintext
1.
2.
3.
data = [[ 4                  ],
        [ 6 ,                ],
        [ 5 ,   3              ],
        [     1 ,   3 ,   6 ,   7 ]]

Стоимость = 35.

У тебя такой-же ответ?
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36823575
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже, что да.
Код: plaintext
Best path: ( 0 ,  0 ) -> ( 0 ,  1 ) -> ( 0 ,  2 ) -> ( 1 ,  2 ) -> ( 1 ,  3 ) -> ( 2 ,  3 ) -> ( 3 ,  3 ) -> ( 4 ,  3 )
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36823588
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А максимум, после добавления строки
Код: plaintext
data = [[-x for x in r] for r in data]
получается вот таким маршрутом:
Код: plaintext
Best path: ( 0 ,  0 ) -> ( 0 ,  1 ) -> ( 1 ,  1 ) -> ( 2 ,  1 ) -> ( 3 ,  1 ) -> ( 3 ,  2 ) -> ( 4 ,  2 ) -> ( 4 ,  3 )
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36823611
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
junior idiotА максимум, после добавления строки
Код: plaintext
data = [[-x for x in r] for r in data]
получается вот таким маршрутом:
Код: plaintext
Best path: ( 0 ,  0 ) -> ( 0 ,  1 ) -> ( 1 ,  1 ) -> ( 2 ,  1 ) -> ( 3 ,  1 ) -> ( 3 ,  2 ) -> ( 4 ,  2 ) -> ( 4 ,  3 )

Хотя это весьма глупо.
Также как и это:
junior idiot
Унрегистеред,
Любая задача максимизации однозначной функции может быть переформулирована в задачу минимизации другой однозначной функции; решения этих задач (точки оптимума) будут совпадать. Это же очевидно.
"F(x) -> max" эквивалентно "G(x) = -F(x) -> min"
В данной задаче достаточно приписать минус ко всем числам в матрице. Или переопределить оператор сравнения элементов priority queue (для c++/c#/java).
Ляпнул неподумавши.
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36823835
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junior idiotПохоже, что да.
Код: plaintext
Best path: ( 0 ,  0 ) -> ( 0 ,  1 ) -> ( 0 ,  2 ) -> ( 1 ,  2 ) -> ( 1 ,  3 ) -> ( 2 ,  3 ) -> ( 3 ,  3 ) -> ( 4 ,  3 )

Если слегка изменить исходные данные. Ввести туда скажем бесконечно большой вес (для простоты пускай будет X), то постановка приобретает несколько иной оттенок.
Код: plaintext
1.
2.
3.
4.
5.
   A     B     C     D     E 
 1 )  1       1       1       1       1 
 2 )  1      X     X     X      1  
 3 )  1       1      X      1       1 
 4 )  1       1      X      1       1 
Это похоже на лабиринт. И декартовый порядок вершин и наличие непроходимых рёбер, наталкивают на мысль о волне .
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36823863
rstudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а там отсечения есть ?
например если на промежуточном этапе получили сумму которая больше чем сумма какого нибудь варианта до этого, то закончить поиск и перейти к следующему.
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36823922
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У "волны" нет отсечений. Вернее для неё отсечения безсмысленны т.к. на каждом уровне рекурсии происходит проверка следующего уровня и тут-же возврат наверк для перехода к следующей ветке. Да и сама рекурсия там "вырождена" в вычисления на декартовой плоскости.

Для Дейкстры - не знаю. Надо подумать.
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36828359
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, ТС сказал, что двигаться можно в любом направлении (я так понимаю, что и по диагонали, и влево, и вверх... естественно, без пересечений пути).
Тогда задача нахождения минимального пути решается по Дейкстре (ну, граф будет немного побольше, но это непринципиально).
А максимумом будет сумма всех клеток, так что это будет задача "пройти по полю из угла в угол, побывав в каждой клетке по одному разу". Алгоритм этот уже известен и реализуется в несколько строк.

Если же матрица будет содержать и отрицательные значения, то минимум можно найти по Беллману-Форду, а максимум можно посчитать и перебором путей, например...
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36828507
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMВообще, ТС сказал, что двигаться можно в любом направлении (я так понимаю, что и по диагонали, и влево, и вверх... естественно, без пересечений пути).
Думаю нет.

Тогда задача нахождения минимального пути решается по Дейкстре (ну, граф будет немного побольше, но это непринципиально).
Волна - это тот-же Дейкстра. Только частный случай, оптимизированный для декартова порядка вершин и одинаковых весов дуг.
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36828566
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTMА максимумом будет сумма всех клеток, так что это будет задача "пройти по полю из угла в угол, побывав в каждой клетке по одному разу". Алгоритм этот уже известен и реализуется в несколько строк.
Несовсем (не всегда) так.
Случай с чётным количеством строк и чётным количеством столбцов совсем не очевиден.
...
Рейтинг: 0 / 0
Помогите решить задачку
    #36829010
rstudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, Дейкстра похоже тот же обход с отсечениями
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите решить задачку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]