A Symmetric Approach to the Knight Puzzle

2024 Aug 30

Professor Alex Biryukov recently asked me the following question:

Consider an n-by-n square checkerboard where the Knight is in the middle. Compute the number of unique paths that the Knight can take in T steps without ever leaving the board.

n = 5. Gray shaded squares are the ones the Knight can move into in the next step.

Consider n = 5 as an example. 

One straightforward approach is to use dynamic programming. The following is a code snippet in Python.


knightMoves = [[-1, -2], [-2, -1], [-1, +2], [-2, +1], [+1, -2], [+2, -1], [+1, +2], [+2, +1]] # How knight moves around the checkerboard

n = 5 # The dimension of the checkerboard

# tab = [[2,3,4,3,2],[3,4,6,4,3],[4,6,8,6,4],[3,4,6,4,3],[2,3,4,3,2]] for n = 5

T = 100 # The number of steps the knight takes


def computePaths(n, curLocation, numSteps):

   dp = [[[0 for step in range(n)] for x in range(n)] for y in range(numSteps + 1)]

   # Start from the initial point

   dp[0][curLocation[0]][curLocation[1]] = 1


   # Fill dp table

   for step in range(1, numSteps + 1):

       for x in range(n):

           for y in range(n):

               for move in knightMoves:

                   stepx = x + move[0]

                   stepy = y + move[1]

                   if 0 <= stepx < n and 0 <= stepy < n: # moves are reversible

                       dp[step][x][y] += dp[step-1][stepx][stepy]

  

   # Sum over DP table

   pathCount = 0

   for x in range(n):

       for y in range(n):

           pathCount += dp[numSteps][x][y]  

   return pathCount


pathCount = computePaths(n, [2,2], T)

Another approach is to make use of the symmetry of the board on top of Markov decision process. We first compute the number of next steps that each square can take. We then color the squares according to their next step configuration, i.e.,  the number and colors of squares that a square can transit into. 

n = 5. Grouped squares.

We can then draw the transition graph and write down the transition matrix. 

Denote the transition matrix as A, i.e., A = [a b c d e]

A = 0 1 0 0 0

8 0 2 0 0

0 2 0 4 0

0 0 2 0 2

0 0 0 2 0


Initial position at the center (represented corresponding to the arrangement of A):

x = [1 0 0 0 0]


We can then compute the number of paths after T steps as Sum(x * (A^T)). 


The following are a few outputs of this method, and they are consistent with the outputs of the DP program.


Number of steps T Sum(x * (A^T))

1 8

10 2807808

20 4832473645056

30 8293608608369737728

99 85718379387099805918515221988077997026934633227442955546001408

100 363672284021636688954470859598443930455076334186446217386393600