I was at middle school when I first heard about the knight's tour problem: place a knight on any square on a chess board, and move it to every square on the board without visiting any square more than once. A chess knight moves by jumping two squares forward and one square sideways, so a big part of the challenge is getting into and out of all the corners. I remember filling up pages and pages of squared notebooks with attempted solutions, although my record from that time was a tour that covered only 61 of the 64 squares.
Well, it's one thing to look for knight's tours by hand, but quite another to search for them with a computer. It is actually a fun programming exercise to search for knight's tours: it is possible to use a standard backtracking algorithm, but it needs a couple of tricks to make it work. Firstly, if you have a choice of squares to jump to, then you should consider them in ascending order of accessibility (i.e., from how many unvisited squares could you jump to this square). This helps to ensure that you don't waste last chances to visit squares. However, even with this trick, it is possible to make mistakes early on in the search that you can never recover from, and end up lost forever in a maze with 1051 turns and no exits. An ugly way to fix this is to assign a move budget—I chose 100 times the number of squares—and if you don't find a solution within this many jumps then give up and start again from an empty board.
Armed with a fast computer, a search algorithm and a couple of tricks, I was finally able to realize a childhood dream and find a knight's tour:
Note that we always begin our tours in the bottom right corner, so that the search program only has to work out how to get into and out of 3 corners: that time spent filling squared notebooks taught me something!
Once the initial problem is solved, I naturally start wondering whether we can find knight's tours on larger boards. It is easy to modify the search program to change the board dimensions from an 8×8 square to an m×n rectangle, but as the board size increases the time it takes to find a knight's tour grows rapidly:
Board size (n×n) | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 |
Search time (ms) | 1 | 3 | 7 | 11 | 26 | 51 | 102 | 225 | 401 | 701 | 1,074 | 1,738 |
Extrapolating these results to a 100×100 board, it seems that my search program would take over a thousand years to find a knight's tour! Clearly I need a new approach to find knight's tours for large boards.
Our 8×8 knight's tour above looks like a little circuit, and drawn the same way a 100×100 knight's tour would look like a huge circuit. But let's take some inspiration from the way that huge circuits are designed in practice: not all at once, but rather by wiring together smaller circuits. Consider this special 6×6 knight's tour:
One reason this knight's tour is special is because it has no start and end: it is a loop! There are probably clever ways to find knight's tours that are loops, but I took a simple-minded approach. I modified my program to keep searching for knight's tours until it found one where the end was a knight's jump away from the start, and then I connected the ends of the tour to make a loop.
There is another reason that this knight's tour is special, which is not so easy to see. You can put two of them together:
then switch two of the jumps around to connect the tours together:
and the result is a knight's tour on a 12×6 board. To see that the result is indeed a tour, let's visualize the two separate knight's tours as loops using a schematic diagram:
And now when we perform the connection step the schematic diagram makes it clear that we have created one big loop from the two separate loops:
The same thing also works by vertically stacking the special 6×6 knight's tour:
and connecting them like so:
I've shown how to connect special 6×6 knight's tours together, and the next step is to connect them in an m×n grid to make a knight's tour of a 6m×6n board. Connecting them together in a grid requires a little bit of care to avoid fragmenting the knight's tour into disconnected paths. Here's a schematic diagram for a 2×2 grid illustrating how tours can be fragmented into disconnected paths:
One way to avoid tour fragmentation is to connect along some path through the grid that visits every 6×6 knight's tour. I chose a spiral, starting at the bottom right of the grid, travelling anti-clockwise and ending in the middle. Here is the schematic diagram for a spiral path on a 3×3 grid:
And here's the resulting knight's tour on an 18×18 board:
At this stage we have the machinery to construct knight's tours for arbitrarily large boards of dimension 6m×6n. But what about boards of other dimensions, such as the 100×100 board that we set as our target? These boards can be handled by searching for more special tours of dimensions m×n, where 6 ≤ m,n ≤ 11, and using these in place of 6×6 knight's tours on the bottom and right edges of the grid. For example, here is a knight's tour of a 23×23 board:
This has the same 3×3 grid pattern as the 18×18 knight's tour, but with larger pieces around the right and bottom edges. Also, the knight's tour in the bottom right corner is not a loop—you can see one of its ends in the bottom right corner—so the schematic diagram for the assembled tour ends up looking a little different:
In fact, it is impossible to find a knight's tour that is a loop on this board, because it has an odd number of squares. To see why, imagine the squares of the board painted light and dark colors in a checkerboard pattern:
As a knight jumps around the board it alternates between light and dark squares, and a tour of a board with an odd number of squares will contain an even number of jumps. This means the start and end squares of the tour will have the same color, and so there's no way to jump from the end square of the tour back to the start square to close the loop.
Using these techniques you can easily assemble knight's tours for large boards: you can view a tour of a 100×100 board or even assemble your own knight's tour:
But these techniques only work for boards where the width and height are at least 6: there are also an infinite number of thin boards that might contain knight's tours:
Can you think of techniques for assembling knight's tours on thin boards? ♘
The performance results were gathered using a MacBook Air with a 1.8GHz Intel Core i7 processor and 4Gb of RAM, running OS X 10.7.5.