Ziel des Programms ist es, verschiedene Flughäfen zu durchqueren und mithilfe eines Breitensuchalgorithmus den kürzesten Weg zwischen PHX und BKK auszugeben. Ich habe jedoch Probleme beim Drucken der Ergebnisse.
Die erwartete Ausgabe (kürzester Pfad) ist: PHX -> LAX ->
const airports = 'PHX BKK OKC JFK LAX MEX EZE HEL LOS LAP LIM'.split(' '); const Routen = [ ['PHX', 'LAX'], ['PHX', 'JFK'], ['JFK', 'OKC'], ['JFK', 'HEL'], ['JFK', 'LOS'], ['MEX', 'LAX'], ['MEX', 'BKK'], ['MEX', 'LIM'], ['MEX', 'EZE'], ['LIM', 'BKK'], ]; //Der Graph const adjacencyList = new Map(); //Knoten hinzufügen Funktion addNode(Flughafen) { adjacencyList.set(airport, []); } // Kante hinzufügen, ungerichtet Funktion addEdge(Ursprung, Ziel) { adjacencyList.get(origin).push(destination); adjacencyList.get(destination).push(origin); } // Das Diagramm erstellen Flughäfen.forEach(addNode); // Jede Route durchlaufen und die Werte in die Funktion addEdge verteilen Routen.forEach(route => addEdge(...route));
Mit dem Knoten als Startpunkt (Standort) und der Kante als Ziel ist der Graph ungerichtet
function bfs(start) { const besuchte = new Set(); besuchte.add(start); // Den Startknoten zur besuchten Liste hinzufügen const queue = [start]; while (queue.length > 0) { const Airport = queue.shift(); // Warteschlange ändern const Destinations = adjacencyList.get(airport); for (const Ziel der Ziele) { if (destination === 'BKK') { console.log(`BFS hat Bangkok gefunden!`) //console.log(path); } if (!visited.has(destination)) { besuchte.add(Ziel); queue.push(Ziel); } } } } bfs('PHX')
我能够按照评论中InSync的建议解决了这个问题
在bfs()函数中,oldpath用于存储每个节点(父节点)所经过的路径,shortest path用于存储结果
新函数的作用很简单,将父节点添加到shortestPath中,然后找到父节点的父节点(如果存在),循环在当前父节点为根节点时退出
不要将节点标记为已访问,而是利用这个机会将该节点与其父节点标记。您可以使用一个 Map 来:
我还建议在函数中避免引用全局变量,而是将所有需要的内容作为参数传递: