|
PROG
|
(Python) # uses alst(), swap() in A089473
def moves3d(p, shape, fixed=None): # n x m x r puzzle
nxt, (n, m, r) = [], shape
L, z = n*m, p.find("-") # z: location of blank
zq, zr = divmod(z, L)
if zr > n - 1: nxt.append(swap(p, z, z-n)) # blank up
if zr < n*m-n: nxt.append(swap(p, z, z+n)) # blank down
if zr%n != 0: nxt.append(swap(p, z, z-1)) # blank left
if zr%n != n-1: nxt.append(swap(p, z, z+1)) # blank right
if zq > 0: nxt.append(swap(p, z, z-L)) # blank in
if zq < r - 1: nxt.append(swap(p, z, z+L)) # blank out
return [m for m in nxt if m.find("-") != fixed]
moves = lambda p, shape: moves3d(p, shape)
start, shape = "-123456789ABCDEFGHIJKLMNOPQ", (3, 3, 3)
|