이 프로그램의 목표는 다양한 공항을 통과하고 너비 우선 검색 알고리즘을 사용하여 PHX와 BKK 사이의 최단 경로를 출력하는 것입니다. 하지만 결과를 인쇄하는 데 문제가 있습니다.
예상되는 출력(최단 경로)은 다음과 같습니다. PHX -> LAX -> BKK
const Airports = 'PHX BKK OKC JFK LAX MEX EZE HEL LOS LAP LIM'.split(' '); const 경로 = [ ['PHX', 'LAX'], ['PHX', 'JFK'], ['JFK', 'OKC'], ['JFK', '헬'], ['JFK', 'LOS'], ['MEX', 'LAX'], ['MEX', 'BKK'], ['멕스', '임'], ['MEX', 'EZE'], ['임', 'BKK'], ]; //그래프 const adjacencyList = new Map(); //노드 추가 함수 addNode(공항) { adjacencyList.set(공항, []); } // 방향이 지정되지 않은 가장자리 추가 function addEdge(출발지, 목적지) { adjacencyList.get(origin).push(destination); adjacencyList.get(destination).push(origin); } // 그래프 생성 Airports.forEach(addNode); // 각 경로를 반복하고 값을 addEdge 함수에 분산시킵니다. Routes.forEach(route => addEdge(...route));
노드를 시작점(사이트)으로 하고 에지를 목적지로 하여 그래프는 방향이 없습니다
function bfs(start) { const 방문 = new Set(); Visited.add(start); // 방문 목록에 시작 노드를 추가합니다. const 대기열 = [시작]; while (queue.length > 0) { const Airport = queue.shift(); // 대기열 변경 const 목적지 = adjacencyList.get(airport); for (목적지의 상수 목적지) { if (대상 === 'BKK') { console.log(`BFS가 방콕을 찾았습니다!`) //console.log(경로); } if (!visited.has(목적지)) { 방문.추가(목적지); queue.push(대상); } } } } bfs('PHX')
InSync의 댓글 제안을 따라 문제를 해결할 수 있었습니다
bfs() 함수에서 oldpath는 각 노드(부모 노드)가 이동한 경로를 저장하는 데 사용되고 최단 경로는 결과를 저장하는 데 사용됩니다
으아악 으아악새 함수의 기능은 매우 간단합니다. shortestPath에 상위 노드를 추가한 다음 상위 노드의 상위 노드를 찾고(존재하는 경우) 현재 상위 노드가 루트 노드일 때 루프가 종료됩니다. 으아악
노드를 방문한 것으로 표시하는 대신 이 기회를 이용하여 노드를 상위 노드로 표시하세요. 지도를 사용하여 다음을 수행할 수 있습니다.
또한 함수에서 전역 변수를 참조하는 것을 피하고 대신 필요한 모든 것을 매개변수로 전달하는 것이 좋습니다.