''' A 8-puzzle grid is coded as a list of 3 lists of size 3, each sublist
containing values from 0 to 8, 0 being the empty space''' solved = [[1, 2, 3], [4, 5, 6], [7, 8, 0]] from copy import deepcopyfrom collections import deque def empty(grid): '''Find the empty space in a grid.''' for i in range(3): for j in range(3): if grid[i][j] == 0: return (i, j) assert False def neighbors(grid): '''Find the neighbors grids of a given grid.''' (i, j) = empty(grid) N = [] for di, dj in [(-1, 0), (1, 0), (0, -1), (0, 1)]: if 0 <= i+di <= 2 and 0 <= j+dj <= 2: g = deepcopy(grid) g[i+di][j+dj] = 0 g[i][j] = grid[i+di][j+dj] N.append(g) return N def key(grid): '''Convert a grid into a tuple of tuple to use an immutable key in the hashtable.''' return tuple(tuple(line) for line in grid) def distance(grid): '''Bread-First Search.''' q = deque() q.append(grid) dist = {key(grid) : 0} while len(q) > 0: g = q.popleft() k = key(g) for gn in neighbors(g): kn = key(gn) if kn not in dist: dist[kn] = dist[k] + 1 q.append(gn) return dist