Пытаюсь решить задачу 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.