Задать вопрос
DZHAMBULAT-SAMOUCHKA
@DZHAMBULAT-SAMOUCHKA
Frontend разработчик

Как найти начальную точку для определения маршрутов в двумерном массиве?

Здраствуйте. Возможно очень странно сформулировал вопрос за это извините. Решая задачу наткнулся на одну проблему. Есть входной двумерный массив с странами:
[["USA", "BRA"], ["JPN", "PHL"], ["BRA", "UAE"], ["UAE", "JPN"]]

Нужно вывести правильную последовательность следования маршрутов объединив элементы массива в одну строку. Вот такой результат должен вывестись:
"USA, BRA, UAE, JPN, PHL"

Всё бы ничего и мой код работал бы (чуть ниже), если бы был известен начальный маршрут от которого нужно отталкиваться. Если поменять местами входные данные то мой код перестаёт выдавать правильную последовательность. Точка начала маршрута у меня находиться в переменной initialRoute. Пример:
[["JPN", "PHL"], ["USA", "BRA"], ["BRA", "UAE"], ["UAE", "JPN"]],
Вывод: "JPN, PHL"


Вот мой код
function findRoutes(routes) {
  const dictionary = {};
  // Точка начала маршрута 
  const initialRoute = routes[0][0];
  const stack = [initialRoute];

  routes.forEach((el) => {
    dictionary[el[0]] = el[1];
  });

  function checkRoutesPos(dictionary, initialRoute) {
    let thisRoute = initialRoute;
    let pushElem = dictionary[thisRoute];
    while (pushElem !== undefined) {
      thisRoute = dictionary[thisRoute];
      stack.push(pushElem);
      pushElem = dictionary[thisRoute];
    }
  }
  checkRoutesPos(dictionary, initialRoute);
  return stack.join(", ");
}
console.log(
  findRoutes([
    ["USA", "BRA"],
    ["JPN", "PHL"],
    ["BRA", "UAE"],
    ["UAE", "JPN"],
  ])
);
console.log(
  findRoutes([
    ["JPN", "PHL"],
    ["USA", "BRA"],
    ["BRA", "UAE"],
    ["UAE", "JPN"],
  ])
);
  • Вопрос задан
  • 237 просмотров
Подписаться 1 Средний 2 комментария
Решение пользователя Tim К ответам на вопрос (5)
Tim-A-2020
@Tim-A-2020
function findSequence(input) {
    const adjacencyList = {}, indegree = {};

    input.forEach(([from, to]) => {
        adjacencyList[from] = (adjacencyList[from] || []).concat(to);
        indegree[to] = (indegree[to] || 0) + 1;
    });

    const start = Object.keys(adjacencyList).find(country => !indegree[country]);
    if (!start) {
        return false;
    }

    const result = [], visited = {};

    function dfs(node) {
        visited[node] = true;
        result.push(node);
        adjacencyList[node]?.forEach(neighbor => !visited[neighbor] && dfs(neighbor));
    }

    dfs(start);
    return result.join(', ');
}
findSequence([["USA", "BRA"], ["JPN", "PHL"], ["BRA", "UAE"], ["UAE", "JPN"]])//"USA, BRA, UAE, JPN, PHL"
Ответ написан