Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 17.11.2020
Сообщений: 17
1

Минимальный путь в таблице

28.03.2022, 10:37. Показов 1248. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В прямоугольной таблице N × M (в каждой клетке которой записано некоторое число) вначале игрок находится в левой верхней клетке. За один ход ему разрешается перемещаться в соседнюю клетку либо вправо, либо вниз (влево и вверх перемещаться запрещено). При проходе через клетку с игрока берут столько у.е., какое число записано в этой клетке (деньги берут также за первую и последнюю клетки его пути).
Требуется найти минимальную сумму у.е., заплатив которую, игрок может попасть в правый нижний угол, а также путь игрока.

Входные данные
Во входных данных задано два числа N и M – размеры таблицы (1 ≤ N ≤ 20, 1 ≤ M ≤ 20). Затем идет N строк по M чисел в каждой – размеры штрафов в у.е. за прохождение через соответствующие клетки (числа от 0 до 100).

Выходные данные
В первой строке выведите минимальную сумму, потратив которую, можно попасть в правый нижний угол.

После этого выведите строку, описывающую путь игрока. Строка должна содержать только символы R и D. Символ R говорит о том, что на очередном шаге надо пойти вправо, а символ D – вниз. В случае нескольких верных ответов выведите любой.
входные данные
3 4
1 1 1 1
5 2 2 100
9 4 2 1
выходные данные
8
RRDDR
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.03.2022, 10:37
Ответы с готовыми решениями:

Минимальный путь между двух точек
Здравствуйте! Я бы хотел сделать простенькую программу, которая бы находила минимальный путь между...

Задача про минимальный путь в лабиринте.
Вот собственно сама задача: Разработать программу, которая ищет минимальный путь в лабиринте....

Путь к таблице DBF в запросе
ADODataSet1->CommandText= "select * from u1.dbf" - работает (таблица в папке с исходником)...

Минимальный путь в таблице
В прямоугольной таблице N×M (в каждой клетке которой записано некоторое число) в начале игрок...

Минимальный путь в таблице (Время: 1 сек. Память: 16 Мб Сложность: 32%)
В прямоугольной таблице NxM (в каждой клетке которой записано некоторое число) в начале игрок...

2
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
28.03.2022, 11:24 2
Лучший ответ Сообщение было отмечено gunslinger как решение

Решение

C++
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <vector>
#include <utility>
#include <climits>
#include <algorithm>
#include <iomanip>
 
int main()
{
    std::vector<std::vector<int>> mtx
    {
        {1, 1, 1, 1},
        {5, 2, 2, 100 },
        {9, 4, 2, 1}
    };
    for (auto v : mtx)
    {
        for (auto val : v)
        {
            std::cout << std::setw(4) << std::left << val;
        }
        std::cout << "\n";
    }
    std::cout << "\n";
    std::vector<std::vector<bool>> vb(mtx.size(), std::vector(mtx[0].size(), false));
    std::vector<std::vector<int>> vp(mtx.size(), std::vector(mtx[0].size(), INT_MAX));
    std::vector<std::pair<int, int>> vv;
    int i{}, j{};
    vp[i][j] = mtx[i][j];
    vv.emplace_back(i, j);
    while (!vv.empty())
    {
        auto it = std::min_element(vv.begin(), vv.end(), [vp](auto const& pa, auto const& pb) {return vp[pa.first][pa.second] < vp[pb.first][pb.second]; });
        i = it->first;
        j = it->second;
        vv.erase(it);
        if (vb[i][j] == false)
        {
            if (i < mtx.size() - 1)
            {
                vp[i + 1][j] = std::min(vp[i + 1][j], vp[i][j] + mtx[i + 1][j]);
                vv.emplace_back(i + 1, j);
            }
            if (j < mtx[0].size() - 1)
            {
                vp[i][j + 1] = std::min(vp[i][j + 1], vp[i][j] + mtx[i][j + 1]);
                vv.emplace_back(i, j + 1);
            }
            vb[i][j] = true;
        }
    }
    // для каждой ячейки показываем стоимость минимального пути в эту ячейку из ячейки {0,0}
    for (auto v : vp)
    {
        for (auto val : v)
        {
            std::cout << std::setw(4) << std::left << val;
        }
        std::cout << "\n";
    }
    std::cout << "\n";
    std::vector<std::pair<int, int>> vs;
    i = vp.size() - 1, j = vp[i].size() - 1;
    vs.emplace_back(i, j);
    while (!(i == 0 && j == 0))
    {
        int wprev = vp[i][j] - mtx[i][j];
        if (i > 0 && wprev == vp[i - 1][j])
        {
            i -= 1;
        }
        else if (j > 0 && wprev == vp[i][j - 1])
        {
            j -= 1;
        }
        vs.emplace_back(i, j);
    }
    std::reverse(vs.begin(), vs.end());
    for (int i = 0; i < vs.size() - 1; ++i)
    {
        std::cout << (vs[i].first == vs[i + 1].first ? 'R' : 'D');
    }
}
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
28.03.2022, 11:58 3
ИМХО, динамические программирование тут в самый раз
0
28.03.2022, 11:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.03.2022, 11:58
Помогаю со студенческими работами здесь

Путь к таблице
У меня программа которая привязана к таблице, а таблица находится в d:/проги/Delphi как и сама...

Минимальный путь
Есть 4 пункта A,B,C,D известно расстояние, если AB=2,Ac=5,Ad=3,BC=4,BD=7 рассчитать минимальный...

Путь к прикрепленной таблице
Такой вопрос. В базе существует прикрепленная таблица, представляющая Excel файл. Если я перенесу...

Минимальный путь в графе
Добрый день. Помогите, пожалуйста, написать программу на матлабе, которая бы искала минимальный...

Найти минимальный путь
Есть массивы строк и чисел (ввод с клавиатуры), где s1 и s2 - начальный и конечный города, c -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru