@petriychuk

Как реализовать рекурсивную функцию волнового алгоритма на языке c?

Есть матрица, каждый елемент которой прописан как елемент структуры динамически, с ссылками на соседние елементы как указатели ways (0, 1, 2, 3) - это навравления - вверх, право, низ, лево соответственно.
typedef struct mapItems{
    int id, xPos, yPos, distance, visited;
    struct mapItem *ways[4];
}mapItem;


Написал код который проверяет соседние елементы и записывает туда расстояние
int wave(mapItem *current, int distance){
    printf(" (%d:%d)b=%d-> ", current->xPos, current->yPos, back);
    int i;
    for(i=0; i<4; i++){
        if((current->ways[i]!=0)&&!(current->ways[i]->visited)){
            if(!current->ways[i]->visited){
                current->ways[i]->distance=distance+1;
            }         
        }  
    }

Не могу понять как рекурсировать эту функцию что б оно проверяло поэтапно, тоесть сначала пройшло по кругу все елементы с расстоянием 1, потом волной дальше. У меня получалось, только оно идет в одну сторону. Надо как то передавать переменную внутрь что оно обработало все вокруг и можно идти дальше. Но я не могу догнать как это написать.
Ссылка на алгоритм.
  • Вопрос задан
  • 814 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Как-то вы перемудрили, рекурсия здесь совершенно не нужна.
Для начала создаём очередь, включаем в неё исходную точку.
Пока очередь не пуста берём из неё точку, всем её доступным незаполненным соседям записываем длину пути и помещаем их в очередь. Можно прервать цикл и раньше, по достижении заданной точки.
Обратным ходом восстанавливаем путь.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Olej
@Olej
инженер, программист, преподаватель
Не могу понять как рекурсировать эту функцию

Вы достаточно сложный вопрос задали + да ещё структур непотребных, избыточно сложных нагородили...
Вы на что рассчитывали?
На то, что вам здесь в 2 слова нарисуют решение задач трассировки?

Написание рекурсивного поиска требует ... определённой привычки. Его в 2 слова не объяснишь.
Вот здесь можете посмотреть: Задачи по программированию на языке C++ - там есть несколько задач (с решениями - cherepah и др.), которые просто повторяют вашу задачу, но в более упрощённой, лёгкой формулировке.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы