Knight's shortest path

O(1) solution

by graemian

HTML

<script src="https://code.jquery.com/jquery-2.2.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

CSS

.board {

            display: inline-block;

        }

        table {
            border-collapse: collapse
        }

        td {
            padding: 0;
            text-align: center;
            vertical-align: middle;
            width: 1em
        }

        tr {

            height: 1em;

        }

        .diagonal {

            background-color: red;
        }

        .special {

            background-color: yellow;
        }

        .vertical {

            border-left: 2px solid black;
            border-right: 2px solid black;

        }

        .vertical.bottom {

            border-bottom: 2px solid black;

        }

        .vertical.top {

            border-top: 2px solid black;

        }

        .horizontal {

            border-top: 2px solid black;
            border-bottom: 2px solid black;

        }

        .horizontal.left {

            border-left: 2px solid black;

        }

        .horizontal.right {

            border-right: 2px solid black;

        }

        .primary-diagonal {

            background-color: red;

        }

        .primary-diagonal div {

            transform: rotate(-45deg);

        }

        .secondary-diagonal {

            background-color: lightblue;

        }

        .secondary-diagonal div {


            transform: rotate(-45deg);

        }


/* This product includes color specifications and designs developed by Cynthia Brewer (http://colorbrewer.org/). */
/* CSS specs as packaged in the D3 library (d3js.org). Please see license at http://colorbrewer.org/export/LICENSE.txt...

JavaScript

// http://stackoverflow.com/a/15310051/1420157
function getCombinations() {
    var r = [], arg = arguments, max = arg.length-1;
    function helper(arr, i) {
        for (var j=0, l=arg[i].length; j<l; j++) {
            var a = arr.slice(0); // clone arr
            a.push(arg[i][j]);
            if (i==max)
                r.push(a);
            else
                helper(a, i+1);
        }
    }
    helper([], 0);
    return r;
}

function generateMovesFromOffsets(allOffsets, x, y) {

    var moves = [];

    allOffsets.forEach(function (offset) {

        moves.push({

            x: x + offset[0],
            y: y + offset[1]

        });

    });

    return moves;

}

function getNextMoves(x, y) {

    var twoVerticalOneHorizontalOffsets = getCombinations([2,-2],[1,-1]);
    var twoHorizontalOneVeritcalOffsets = getCombinations([1,-1],[2,-2]);

    var allOffsets = twoVerticalOneHorizontalOffsets.concat( twoHorizontalOneVeritcalOffsets );

    return generateMovesFromOffsets(allOffsets, x, y);

}

function newBoard(size) {

    var board = new Array(size);

    for (var i = 0; i < size; i++) {

        board[i] = new Array(size);

    }

    var middle = size / 2;

    board[middle][middle] = 0;

    return board;

}


function getBoardOffset(board) {

    return board.length / 2;

}

function setMoveCount(x, y, count, board) {

    var offset = getBoardOffset(board);

    board[y + offset][x + offset] = count;

}

function getMoveCount(x, y, board) {

    var offset = getBoardOffset(board);

    var row = board[y + offset];

    return row[x + offset];

}

function printTextBoard(board) {

    var s = require("underscore.string");

    var offset = getBoardOffset(board);

    for (var r = offset - 1; r >= -offset; r--) {

        var row = "";

        for (var c = -offset; c < offset; c++) {

            var moveCount = getMoveCount(c, r, board);

            if (moveCount === undefined)
                moveCount = "";

            row +=...