Use this to learn the idea, then write your own version.
1class Solution:2 def __init__(self):3 self.SIZE = 504 self.MAX = 1_000_0005 self.DIRS = ((1, 2), (2, 1), (2, -1), (1, -2),6 (-1, -2), (-2, -1), (-2, 1), (-1, 2))7 8 def maxMoves(self, kx: int, ky: int, positions: list[list[int]]) -> int:9 n = len(positions)10 positions.append([kx, ky])11 hashedPositionToIndex = {}12 13 dist = [[0] * (n + 1) for _ in range(n + 1)]14 15 for i, (x, y) in enumerate(positions):16 hashedPositionToIndex[self._hash(x, y)] = i17 18 for sourceIndex in range(n + 1):19 self._bfs(positions, sourceIndex, hashedPositionToIndex, dist)20 21 MAX_MASK = 1 << (n + 1)22 23 24 25 26 dp = [[[0, 0]27 for _ in range(1 << (n + 1))]28 for _ in range(n + 1)]29 30 for i in range(n + 1):31 for mask in range(MAX_MASK - 1):32 dp[i][mask] = [-self.MAX, self.MAX]33 34 for mask in range(MAX_MASK - 2, -1, -1):35 for i in range(n + 1):36 for turn in range(2):37 for j in range(n):38 if mask >> j & 1:39 continue40 moves = dist[i][j] + dp[j][mask | 1 << j][1 - turn]41 dp[i][mask][turn] = (max(dp[i][mask][turn], moves) if turn == 0 else42 min(dp[i][mask][turn], moves))43 44 45 46 return dp[n][1 << n][0]47 48 def _hash(self, x: int, y: int) -> int:49 return x * self.SIZE + y50 51 def _bfs(52 self,53 positions: list[list[int]],54 sourceIndex: int,55 hashedPositionToIndex: dict[int, int],56 dist: list[list[int]]57 ) -> None:58 """59 Computes the distance between positions[sourceIndex] and other positions.60 """61 sx, sy = positions[sourceIndex]62 q = collections.deque([(sx, sy)])63 seen = {(sx, sy)}64 seenPositions = 065 66 step = 067 while q and seenPositions < len(positions):68 for _ in range(len(q)):69 i, j = q.popleft()70 hashedPosition = self._hash(i, j)71 if hashedPosition in hashedPositionToIndex:72 dist[sourceIndex][hashedPositionToIndex[hashedPosition]] = step73 seenPositions += 174 for dx, dy in self.DIRS:75 x = i + dx76 y = j + dy77 if x < 0 or x >= self.SIZE or y < 0 or y >= self.SIZE:78 continue79 if (x, y) in seen:80 continue81 q.append((x, y))82 seen.add((x, y))83 step += 184