https://github.com/tonitaga/wave-algorithm-cpp-python
Standard implementation of the Wave Algorithm in C++ and Python programming languages for finding the shortest path in a matrix between two points
https://github.com/tonitaga/wave-algorithm-cpp-python
algorithms console cpp python
Last synced: 10 months ago
JSON representation
Standard implementation of the Wave Algorithm in C++ and Python programming languages for finding the shortest path in a matrix between two points
- Host: GitHub
- URL: https://github.com/tonitaga/wave-algorithm-cpp-python
- Owner: tonitaga
- License: unlicense
- Created: 2023-08-30T14:41:11.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2023-09-09T09:11:51.000Z (over 2 years ago)
- Last Synced: 2025-01-03T10:46:03.578Z (12 months ago)
- Topics: algorithms, console, cpp, python
- Language: Python
- Homepage: https://habr.com/ru/articles/745294/
- Size: 59.6 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Wave-Algorithm-CPP-Python
---
[Wave Algorithms School21 version]((https://youtu.be/GuOl91bw500?si=hGgJxHhbcRQU-SQn)
---
---
> Волновой алгоритм — это алгоритм поиска пути, который использует волновое распространение для определения кратчайшего пути от начальной вершины до целевой вершины.
>
> Название алгоритму дано не случайно, поведение алгоритма соответствует распространению волны, волна огибает препятствия, постепенно заполняя все пространство
>
> Всем привет! Меня зовут Нурислам (aka tonitaga), я участник School21 и сегодня я бы вам хотел рассказать о Волновом алгоритме.
---
## Правила волнового алгоритма
Волновой алгоритм разделяется на три этапа:
1) Первичная инициализация
2) Распространение волны
3) Восстановление пути
---
### Первичная инициализация
* Для правильной работы алгоритма, мы в первую очередь должны инициализировать переменные начальными значениями
* Матрица длин (length_map) — это самое главное в этом алгоритме, по нему мы и будет находить кратчайший путь. У этой матрицы будет всего два типа значений: -1 (Если волна еще не была в этой клетке) и "неотрицательное число" - расстояние от начальной точки до текущей.
* Клетка старта в матрице длин будет помечена как 0, так как расстояние от начальной клетки до начальной и есть 0. От этой клетки и начнется распространение волны.
* Также нужны две волны, текущая и предыдущая (стартовая) от которой получается текущая волна, соответсвенно wave и old_wave
* old_wave будет иметь в самом начале лишь одну точку распространения волны, а именно стартовую.
---
### Распространение волны
* Постепенно от каждой точки в old_wave распространяется в возможные клетки, к которых ранее еще не были, новые клетки сохраняем в wave
---
### Восстановление пути
* Волновой алгоритм находит все пути сразу, но нам нужен именно кратчайший путь
* Для того чтобы получить его, там нужно итеративно вернуться из точки финиша в точку старта, для того чтобы это сделать будем использовать матрицу длин.
* Зная значения в матрице длин, будем постепенно возвращаться, чтобы понять куда нам идти (вверх, вниз, вправо, влево), нужно всего лишь сравнить значение текущей клетки и клетки направления, и если клетка направления имеет число меньше чем текущее на 1, то это и есть наш путь.
* Путь будем искать пока не дойдем до начальной точки (вспомним, что начальную точку в матрице длин мы инициализировали нулем)