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);
        });
    }
}