Прежде всего, неверный код разбора графа.Первая строка определяет ширину и высоту, где ширина - количество символов в строке, высота - количество строк.Поэтому поменяйте местами &a
и &b
в первом scanf или поменяйте местами порядок вложенных циклов for
(но не обоих).Кроме того, мне пришлось добавить фиктивные вызовы scanf("%c", &dummy);
в разных местах, чтобы отфильтровать новые строки.Простой дамп, такой как этот, поможет определить, была ли ваша карта проанализирована правильно:
cout << "a=" << a << endl;
cout << "b=" << b << endl;
for (int i=0; i<a; i++) {
for(int j=0; j<b; j++) {
cout << (char)('0' + map[i][j]) << ",";
}
cout << endl;
}
Примечание: я также установил map[i][j]
в 0 для 'S' и 'D', также изменяя повторяющиесяif
операторов в цепочку if; else if; else
.Это делает алгоритм более устойчивым, поскольку вы можете в общем случае добавлять время из источника или получателя.
Теперь перейдем к самому алгоритму ....
Каждый цикл алгоритма увеличивается result
по текущему весу местоположения карты.Однако алгоритм ищет несколько путей одновременно (т.е. количество записей в очереди с приоритетами), и поэтому result
заканчивается суммой весов всех обработанных узлов, а не веса текущего пути.Текущий вес пути равен top.temp
, поэтому вы можете исключить переменную result
и просто вернуть top.temp
при достижении пункта назначения.
Также, как отмечалось в других ответах, вам нужно использовать X[i]
и Y[i]
в вашем внутреннем цикле, иначе вы ищете только в одном направлении.
Теперь, из-за сложения / вычитания из X[i]
и Y[i]
, вы, скорее всего, получите доступ к map[][]
outдиапазона (-1 или 25).Поэтому я рекомендую переместить ограждения if
во внутреннюю петлю for
для защиты от доступа вне зоны действия.Это также позволяет избежать заполнения очереди приоритетов недопустимыми возможностями.
Вот моя версия алгоритма с минимальными исправлениями для справки:
priority_queue<node>pq;
pq.push(src);
while(!pq.empty())
{
node top = pq.top();
pq.pop();
if(top.x==dest.x && top.y==dest.y) return top.time;
if(vis[top.x][top.y]) continue;
vis[top.x][top.y]=true;
for(int i=0;i<4;i++)
{
tempa.x=top.x+X[i];
tempa.y=top.y+Y[i];
if(tempa.x<0 || tempa.x>=a) continue;
if(tempa.y<0 || tempa.y>=b) continue;
tempa.time=top.time + map[tempa.x][tempa.y];
pq.push(tempa);
}
}
return -1;
Надеюсь, это поможет.