Я пытаюсь реализовать алгоритм в стиле «6 градусов», в котором я пытаюсь найти кратчайший путь между двумя ссылками. В этом сценарии это видеоигра с картами областей, в которых есть порталы / деформации, связанные друг с другом.
Каждая карта имеет идентификатор карты int id
и может иметь несколько порталов, реализованных как List<Portal>
.
Каждый портал ведет к карте, int ToMapID
и имеет карту, которая его содержит, Map HomeMap
.
Во всяком случае, мне удалось найти наименьшее количество перекосов между двумя картами, что хорошо, потому что именно к этому я и стремлюсь. Проблема в том, что мне трудно обдумать, как записать путь, пройденный из точки А в точку Б.
Вот что я реализовал:
Map start = allMaps[0];
Map end = allMaps[1];
int distance = 0;
List<Portal> alreadyChecked = new List<Portal>();
List<Portal> queue = start.Portals;
while (queue.Count > 0) {
distance++;
List<Portal> newQueue = new List<Portal>();
foreach (Portal p in queue) {
foreach (Portal tm in theMap.Portals) {
if (!alreadyChecked.Contains(tm)) {
alreadyChecked.Add(tm);
if (tm.ToMap == end.ID) {
Console.WriteLine("Found a path, it is " + distance + " map(s) away;");
Console.ReadKey();
Environment.Exit(0);
}
newQueue.Add(tm);
}
}
}
queue = newQueue;
}
В идеале я хотел бы иметь массив Map[]
, который имеет порядок шагов для перехода из точки А в точку Б.
Хотя я абсолютно не знаю, с чего начать. Как мне разгадать путь?