На вход программе даются две точки: точка старта и точка финиша.
Необходимо из точки старта попасть в точку финиша. Шагать из любой точки можно несколькими способами.
int start; //точка старта
2*start; //из любой точки
(3*start)+1; //тоже из любой точки
start/2; //только из точек с четным номером
(start-1)/3; //из точек номер которых при делении на 3 дает остаток от деления 1
Как сделать перебор всех вариантов и вывести самый короткий путь? Интересует сам алгоритм.
Пример программы.
На вход 1 6.
На выход
7
1 4 8 16 5 10 3 6.
Ответ
Вобщем, строим граф на лету, индексы - номера вершин. Поиск в ширину. Классика, так сказать...
На коленке писанный код тут и ниже. Оптимизации, ввод-вывод и т.п. - напишите сами, я этим не заморачивался, жестко прошил 1 и 6....
#include
using namespace std;
struct Node
{
Node(int i, int p = -1):idx(i),prev(p){}
int idx; // Индекс
int prev; // Предыдущий узел - для восстановления пути
bool operator <(const Node& n) const { return idx < n.idx; }
};
int main()
{
int start = 1, stop = 6;
queue
Q.push(Node(start));
while(!Q.empty())
{
S.insert(Q.front()); // Внесли в обработанные
int index = Q.front().idx; // Индекс
if (index == stop) break; // Найден!
Q.pop(); // Убираем из очереди
vector
// Вывод цепочки - так как в обратном порядке, используем стек
stack
Комментариев нет:
Отправить комментарий