Задать вопрос
@New-Developer
Изучаю JavaScript

Где ошибка в алгоритме?

Пытаюсь решить задачу codewars.com/kata/585894545a8a07255e0002f1 с помощью DFS итеративным путем. Когда соединяемых узлов больше 6, функция работает неправильно, выдает меньшее значение. Где искать ошибку ?
const O = {
  'A': ['B', 'D', 'E', 'F', 'H'],
  'B': ['A', 'C', 'D', 'E', 'F', 'G', 'I'],
  'C': ['B', 'D', 'E', 'F', 'H'],
  'D': ['A', 'B', 'C', 'E', 'G', 'H', 'I'],
  'E': ['A', 'B', 'C', 'D', 'F', 'G', 'H', 'I'],
  'F': ['A', 'B', 'C', 'E', 'G', 'H', 'I'],
  'G': ['B', 'D', 'E', 'F', 'H'],
  'H': ['A', 'C', 'D', 'E', 'F', 'G', 'I'],
  'I': ['B', 'D', 'E', 'F', 'H']
};
const Active = {
  'E': { 'A': 'I', 'B': 'H', 'C': 'G', 'D': 'F', 'F': 'D', 'G': 'C', 'H': 'B', 'I': 'A' },
  'B': { 'A': 'C', 'C': 'A' },
  'H': { 'G': 'I', 'I': 'G' },
  'D': { 'A': 'G', 'G': 'A' },
  'F': { 'C': 'I', 'I': 'C' }
};
function countPatternsFrom2(firstPoint, length) {
  if (length > 9) return 0;
  let sum = 0, stack = [firstPoint], actived = [], id = 0;
  while (stack.length) {
    let v0 = stack.slice(-1)[0], w = stack.slice(-2)[0], x = stack.length;
    if (x == length) {
      id = O[w].findIndex((v, i) => i > O[w].indexOf(v0) && !stack.includes(v));
      stack.pop();
      sum++;
      if (id == -1) {
        for (key in Active) {
          if (stack.includes(key) && w in Active[key] && !stack.includes(Active[key][w])) {
            sum++
          }
        }
      }
      continue
    };
    if (id == -1) {
      if (actived[x - 1] == `${actived[x - 1]}`) {
        if (actived[x - 1].length) {
          stack[x - 1] = actived[x - 1][0];
          id = O[stack[x - 1]].findIndex(v => !stack.includes(v));
          actived[x - 1] = actived[x - 1].slice(1)
        } else {
          stack.length -= 1;
          actived.length = stack.length;
        }
        continue
      }
      id = O[w].findIndex((v, i) => i > O[w].indexOf(v0) && !stack.includes(v));
      stack.pop();
      if (id == -1) {
        let L = '';
        for (key in Active) {
          if (stack.includes(key) && w in Active[key] && !stack.includes(Active[key][w])) {
            L += Active[key][w]
          }
        }
        if (L.length) {
          stack[x - 1] = L[0];
          actived[x - 1] = L.slice(1);
          id = O[stack[x - 1]].findIndex(v => !stack.includes(v));
        }
      }
      continue
    };
    stack.push(O[v0][id]);
    id = O[stack.slice(-1)[0]].findIndex(v => !stack.includes(v))
  }
  return sum
}
console.log(countPatternsFrom2('E', 7));

Здесь O - соединения по прямой, Active - соединения через ранее посещенные узлы.
Задача не сложная, если решать через BFS, но нужно именно итеративным DFS.
  • Вопрос задан
  • 254 просмотра
Подписаться 2 Средний 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽