This is an implementation of The Knight's Tour problem/solution in JavaScript.
To run:
node tour.js| const SIZE = 8; | |
| const START = [1, 3]; | |
| let board = []; | |
| const possibleMoves = [ | |
| [2, 1], | |
| [2, -1], | |
| [1, 2], | |
| [1, -2], | |
| [-1, 2], | |
| [-1, -2], | |
| [-2, 1], | |
| [-2, -1], | |
| ]; | |
| /** | |
| * Reset the board. | |
| */ | |
| const resetBoard = () => { | |
| board = []; | |
| for (let x = 0; x < SIZE; x++) { | |
| board[x] = []; | |
| for (let y = 0; y < SIZE; y++) { | |
| board[x][y] = -1; | |
| } | |
| } | |
| }; | |
| /** | |
| * Render the board in its current state. | |
| */ | |
| const renderBoard = () => { | |
| let rendered = ""; | |
| for (const row of board) { | |
| rendered = `${rendered}\n`; | |
| for (const space of row) { | |
| rendered = `${rendered} ${String(space).padStart(3, " ")}`; | |
| } | |
| } | |
| console.log(rendered); | |
| }; | |
| /** | |
| * Determine whether a given set of coordinates are a valid and available space | |
| * on the board. | |
| */ | |
| const isValid = ([x, y]) => board[x] && board[x][y] === -1; | |
| const getValidMoves = ([x, y]) => { | |
| const moves = []; | |
| for (const [moveX, moveY] of possibleMoves) { | |
| const toX = x + moveX; | |
| const toY = y + moveY; | |
| if (isValid([toX, toY])) { | |
| moves.push([toX, toY]); | |
| } | |
| } | |
| return moves; | |
| }; | |
| /** | |
| * Solve the Knight's Tour problem given starting coordinates. | |
| */ | |
| const solve = ([x, y], moveNumber = 0) => { | |
| if (!isValid([x, y])) { | |
| throw new Error(`The starting position x:${x} and y:${y} is invalid`); | |
| } | |
| board[x][y] = moveNumber; | |
| if (moveNumber + 1 === SIZE * SIZE) { | |
| return true; | |
| } | |
| const sortedMoves = getValidMoves([x, y]).sort( | |
| (a, b) => getValidMoves(a).length - getValidMoves(b).length | |
| ); | |
| for (const [toX, toY] of sortedMoves) { | |
| if (solve([toX, toY], moveNumber + 1)) { | |
| return true; | |
| } | |
| board[toX][toY] = -1; | |
| } | |
| return false; | |
| }; | |
| let successes = 0; | |
| let failures = 0; | |
| for (startX = 0; startX < 8; startX++) { | |
| for (startY = 0; startY < 8; startY++) { | |
| resetBoard(); | |
| const success = solve([startX, startY]); | |
| if (success) { | |
| successes = successes + 1; | |
| } else { | |
| failures = failures + 1; | |
| } | |
| renderBoard(board); | |
| } | |
| } | |
| console.log("Successes", successes); | |
| console.log("Failures", failures); |
i think that the 63th position must be able to move to the 0th position