Мне нужно найти кратчайший путь из точки D в R. Это фиксированные точки. Это пример ситуации:
В ящике также есть стены, через которые вы не сможете пройти, если не сломаете их. Каждое разрушение стены стоит вам, скажем, «а» очков, где «а» — положительное целое число. Каждый ход, не связанный со стеной, стоит вам 1 очко.
Миссия состоит в том, чтобы найти из всех путей минимальной стоимости тот, в котором меньше всего сломанных стен.
Поскольку ширина поля может достигать 100 ячеек, использование поиска с возвратом не имеет значения. Это слишком медленно. Единственное решение, которое я придумал, это одно:
- Идите на восток или юг, если нет стен
- Если на юге есть стена, проверьте, есть ли стена на западе. Если на западе есть стена, сломайте южную стену. Если на западе нет стены, идите на запад, пока не найдете южную камеру без стены. Повторите этот процесс с югом и востоком, пока не превысите стоимость сломанной стены в этом порядке. Если путь с запада ведет в то же место, как если бы я сломал южную стену, и стоит столько же или меньше очков «а», то используйте этот путь, иначе сломайте южную стену.
- Если ничего выше не встречается, разбейте южную или восточную стену, в зависимости от границы коробки.
Повторяйте шаги 1, 2, 3, пока «пассажир» не прибудет в точку R. Между этими тремя шагами существуют отношения «иначе-если».
Можете ли вы придумать лучший алгоритм решения задачи? Программирую на С++.