Ваш алгоритм предполагает, что на графике нет циклов, что не похоже на случай, если у вас есть список соседей. Алгоритм переходит от ячейки 0, 0
к 0, 1
, которая имеет 0, 0
в качестве соседа, и ставится в очередь. Затем 0, 0
имеет 0, 1
в качестве соседа, который имеет 0, 0
в качестве соседа ....
Это необычно, что вы игнорируете порядок координат при проверке, достигли ли вы места назначения, но это не связано с бесконечный l oop (arrayEquality
ошибочно назван - он надежно проверяет только примитивы из-за строкового преобразования и игнорирует порядок).
С точки зрения дизайна, я бы не стал жестко закодировать начальную и конечную точки в сетка. Я не уверен, что имеет смысл соединять каждую ячейку в сетке, поэтому, вероятно, вы захотите передать граф со стенами (т.е. соседи указаны c для каждой ячейки, если это действительно лабиринт).
Кроме того, алгоритм ничего не делает, когда находит путь через сетку. Я взял на себя смелость скорректировать некоторые из этих вещей, чтобы сделать пример более целенаправленным, опуская соседний лабиринт. Я также использую JS, чтобы вы могли запустить его в фрагменте стека.
const inGrid = (x, y, rows, cols) =>
x >= 0 && y >= 0 && x < cols && y < rows
;
const shortestPath = (rows, cols, src, dst) => {
const queue = [[src, []]];
for (const visited = new Set(); queue.length;) {
const [[x, y], path] = queue.shift();
const key = "" + [x, y];
if (visited.has(key)) continue;
visited.add(key);
path.push([x, y]);
if (key === "" + dst) return path;
[[x-1, y], [x, y+1], [x+1, y], [x, y-1]].forEach(e => {
if (inGrid(...e, rows, cols)) {
queue.push([e, path.slice()]);
}
});
}
};
console.log(JSON.stringify(shortestPath(5, 5, [0, 0], [4, 4])));
Вот пример довольно надуманного лабиринта со стенами:
const shortestPath = (maze, src, dst) => {
const queue = [[src, []]];
for (const visited = new Set(); queue.length;) {
const [[x, y], path] = queue.shift();
const key = "" + [x, y];
if (visited.has(key)) continue;
visited.add(key);
path.push([x, y]);
if (key === "" + dst) return path;
queue.push(...maze[key].map(e => [e, path.slice()]));
}
};
const maze = {
"0,0": [[0, 1], [1, 0]],
"0,1": [[0, 0], [0, 2]],
"0,2": [[0, 1], [1, 2]],
"1,0": [[0, 0], [1, 1]],
"1,1": [[1, 0]],
"1,2": [[0, 2]]
};
/*
.--------.
|
| --. |
| |
`--------`
*/
console.log(JSON.stringify(shortestPath(maze, [0, 0], [1, 2])));