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 +=...