A **knight's tour** is a sequence of moves of a knight on a chessboard such that the knight visits every square only once. This problem mentioned in page of tasks still without Maple implementation.

The post presents the implementation of this task in Maple. Required parameter of the procedure (named **KnightTour**)** ** is **address** - the address of the initial square in the algebraic notation. The second parameter **opt** is optional parameter:

1) if **opt** is **sequence **(by default)** **then the procedure returns the sequence of moves of the knight in the usual algebraic notation,

2) if **opt** is **diagram **** **then the procedure returns the plot of moves of the knight and sequentially numbers all the visited squares,

3) if **opt** is **animation **** **then the procedure returns an animation of moves of the knight.

In the procedure is used a solution with maximum symmetry by George Jelliss, http://www.mayhematics.com/t/8f.htm

Code of the procedure:

**KnightTour := proc(address::symbol, opt::symbol := sequence)**

**local L, n, L1, k, i, j, squares, border, chessboard, letters, digits, L2, L3, Tour, T, F;**

**uses ListTools, plottools, plots;**

**L := [a1, b3, d2, c4, a5, b7, d8, e6, d4, b5, c7, a8, b6, c8, a7, c6, b8, a6, b4, d5, e3, d1, b2, a4, c5, d7, f8, h7, f6, g8, h6, f7, h8, g6, e7, f5, h4, g2, e1, d3, e5, g4, f2, h1, g3, f1, h2, f3, g1, h3, g5, e4, d6, e8, g7, h5, f4, e2, c1, a2, c3, b1, a3, c2];**

**n := Search(address, L);**

**L1 := [L[n .. 64][], L[1 .. n-1][]];**

**if opt = sequence then return L1[] fi;**

**k := 0;**

**for i to 8 do**

**for j from `if`(type(i, odd), 1, 2) by 2 to 8 do**

**k := k+1;**

**squares[k] := polygon([[i-1/2, j-1/2], [i-1/2, j+1/2], [i+1/2, j+1/2], [i+1/2, j-1/2]], color = grey);**

**od; od;**

**squares := convert(squares, list);**

**border := curve([[1/2, 1/2], [1/2, 17/2], [17/2, 17/2], [17/2, 1/2], [1/2, 1/2]], color = black, thickness = 4);**

**chessboard := display(squares, border);**

**letters := [a, b, c, d, e, f, g, h];**

**digits := [$ 1 .. 8];**

**L2 := convert~(L1, string);**

**L3 := subs(letters=~digits, map(t->[parse(t[1]), parse(t[2])], L2));**

**Tour := curve(L3, color = red, thickness = 3);**

**T := textplot([seq([op(L3[i]), i], i = 1 .. 64)], align = above, font = [times, bold, 16]);**

**if opt = diagram then return display(chessboard, Tour, T, axes = none) fi;**

**F := seq(display(chessboard, curve(L3[1 .. s], color = red, thickness = 3), textplot([seq([op(L3[i]), i], i = 1 .. s)], align = above, font = [times, bold, 16])), s = 1 .. 64);**

**display(seq(F[i]$5, i = 1 .. 64), insequence = true, axes = none);**

**end proc:**

Examples of use:

**KnightTour(f3); **

**KnightTour(f3, diagram);**

**KnightTour(f3, animation);**

KnightTour.mw