dijkstra

A simple dijkstra implementation with a table to display the progression.

CSS

body { margin: 0px; }
table { border-collpase: collapse; border: solid 1px #000; }
td { width: 6px; height: 6px; border: solid 1px #000; }
td.source { background-color: #f00; }
td.target { background-color: #00f; }
td.path { background-color: #0f0; }
td.close { background-color: #ccc; }
td.wall { background-color: #000; }

JavaScript

COLS = Math.floor(window.innerWidth / 16);
ROWS = Math.floor(window.innerHeight / 16);

INFINITY = 0x7FFFFFFF;

var table = document.createElement("table");
var tbody = document.createElement("tbody");

for (var i = 0; i < ROWS; i++)
{
    var row = document.createElement("tr");
    
    for (var j = 0; j < COLS; j++)
    {
        row.appendChild(document.createElement("td"));
    }
    
    tbody.appendChild(row);
}

table.appendChild(tbody);
document.body.appendChild(table);

function setClass(index, className) {
    var cellIndex = index % COLS;
    var rowIndex = Math.floor(index / COLS);
    
    if (tbody.rows[rowIndex].cells[cellIndex].className == ""
        || tbody.rows[rowIndex].cells[cellIndex].className === "close")
    {
        tbody.rows[rowIndex].cells[cellIndex].className = className;
    }
}

Array.prototype.contains = function(value) {
    for (var i = 0; i < this.length; i++)
    {
        if (this[i] === value)
        {
            return true;
        }
    }
    
    return false;
}
    
Array.prototype.pushIfNotIn = function(value, arr) {
    if (!arr.contains(value))
    {
        this.push(value);
    }
}

var walls = [];

for (var i = 0; i < 10; i++)
{
    var index = Math.floor(Math.random() * COLS * ROWS);
    
    if (Math.random() < 0.5)
    {
        var m = Math.min(Math.floor(Math.random() * COLS), COLS - index % COLS);
        
        for (var j = 0; j < m; j++)
        {
            walls.push(index + j);
            
            setClass(index + j, "wall");
        }
    }
    else
    {
        var m = Math.min(Math.floor(Math.random() * ROWS), ROWS - Math.floor(index / COLS));
        
        for (var j = 0; j < m; j++)
        {
            walls.push(index + j * COLS);
            
            setClass(index + j * COLS, "wall");
        }
    }
}

var graph = [];

for (var i = 0; i < COLS * ROWS; i++)
{
    var edges = [];
    
    if (i % COLS > 0) edges.pushIfNotIn(i - 1, walls);
    if (i % COLS < COLS - 1)...