JSFiddle - React, Tailwind, and code Playground
by Minko Gechev
JavaScript
var graph =
[[0,0,0,0,0,0,0],
[0,1,0,0,0,0,0],
[0,1,0,1,1,1,0],
[0,1,1,1,0,0,0],
[0,1,0,1,0,0,0],
[0,0,1,1,1,2,0],
[0,0,0,0,0,0,0]];
var src = { x: 1, y: 1 },
result = bfs(graph, src, 2),
path = result.parents,
current = result.dest,
stack = [];
while (current.x !== src.x || current.y !== src.y) {
stack.push(current);
current = path[current.x][current.y];
}
stack.push(src);
while (stack.length) {
current = stack.pop();
console.log(current.x, current.y);
}
function bfs(graph, start, goal) {
var queue = [],
parents = [],
current, n;
function visit(n, current, queue, parents) {
if (!parents[n.x] || !parents[n.x][n.y]) {
parents[n.x] = parents[n.x] || [];
parents[n.x][n.y] = current;
queue.push(n);
}
}
queue.push(start);
while (queue.length !== 0) {
current = queue.shift();
if (graph[current.x][current.y] === goal) {
return {
parents: parents,
dest: current
};
}
n = [
{ x: current.x + 1, y: current.y },
{ x: current.x - 1, y: current.y },
{ x: current.x, y: current.y + 1 },
{ x: current.x, y: current.y - 1 },
];
n.forEach(function (c) {
if (graph[c.x][c.y] !== 0)
visit(c, current, queue, parents);
});
}
}