50 lines
1.8 KiB
Text
50 lines
1.8 KiB
Text
import <Utilities/Sequence.sl>;
|
|
import <Utilities/Conversion.sl>;
|
|
|
|
main(args(2)) :=
|
|
let
|
|
N := stringToInt(args[1]) when size(args) > 0 else 8;
|
|
M := stringToInt(args[2]) when size(args) > 1 else N;
|
|
startX := stringToInt(args[3]) when size(args) > 2 else 1;
|
|
startY := stringToInt(args[4]) when size(args) > 3 else 1;
|
|
board[i,j] := 0 foreach i within 1 ... N, j within 1 ... M;
|
|
spacing := size(toString(N*M)) + 1;
|
|
in
|
|
join(printRow(
|
|
tour(setBoard(board, startX, startX, 1), [startX,startY], 2),
|
|
spacing));
|
|
|
|
potentialMoves := [[2,1], [2,-1], [1,2], [1,-2], [-1,2], [-1,-2], [-2,1], [-2,-1]];
|
|
|
|
printRow(row(1), spacing) := join(printSquare(row, spacing)) ++ "\n";
|
|
|
|
printSquare(val, spacing) :=
|
|
let
|
|
str := toString(val);
|
|
in
|
|
duplicate(' ', spacing - size(str)) ++ str;
|
|
|
|
tour(board(2), current(1), move) :=
|
|
let
|
|
validMoves := validMove(board, current + potentialMoves);
|
|
numMoves[i] := size(validMove(board, validMoves[i] + potentialMoves));
|
|
chosenMove := minPosition(numMoves);
|
|
in
|
|
board when move > size(board) * size(board[1]) else
|
|
[] when size(validMoves) = 0 else
|
|
[] when move < size(board) * size(board[1]) and numMoves[chosenMove] = 0 else
|
|
tour(setBoard(board, validMoves[chosenMove][1], validMoves[chosenMove][2], move), validMoves[chosenMove], move + 1);
|
|
|
|
validMove(board(2), position(1)) :=
|
|
(position when board[position[1], position[2]] = 0)
|
|
when position[1] >= 1 and position[1] <= size(board) and position[2] >= 1 and position[2] <= size(board);
|
|
|
|
minPosition(x(1)) := minPositionHelper(x, 2, 1, x[1]);
|
|
minPositionHelper(x(1), i, minPos, minVal) :=
|
|
minPos when i > size(x) else
|
|
minPositionHelper(x, i + 1, minPos, minVal) when x[i] > minVal else
|
|
minPositionHelper(x, i + 1, i, x[i]);
|
|
|
|
setBoard(board(2), x, y, value)[i,j] :=
|
|
value when x = i and y = j else
|
|
board[i,j] foreach i within 1 ... size(board), j within 1 ... size(board[1]);
|