### complete puzzle

parent 69d1b430
 from microbit import * size = 3 grid = [[4, 1, 3], [7, 2, 6], [0, 5, 8]] solvedGrid = [[1, 2, 3], [4, 5, 6], [7, 8, 0]] def copy(grid): return [[y for y in x] for x in grid] def isSolved(grid): return grid == solvedGrid def showGrid(grid): for x in range(1, size + 1): for y in range(1, size + 1): display.set_pixel(y, x, grid[x-1][y-1]) def lightUp(): display.set_pixel(0, 0, 9) display.set_pixel(0, 4, 9) display.set_pixel(4, 0, 9) display.set_pixel(4, 4, 9) def getMoves(grid): # find the zero for x in range(size): for y in range(size): if grid[x][y] == 0: zerox = x zeroy = y # where can we move? xswaps = [((zerox, zeroy), (x, zeroy)) for x in [zerox - 1, zerox + 1] if x >= 0 and x < size] yswaps = [((zerox, zeroy), (zerox, y)) for y in [zeroy - 1, zeroy + 1] if y >= 0 and y < size] return xswaps + yswaps def swap(grid, move): pos0, pos1 = move x0, y0 = pos0 x1, y1 = pos1 tmp = grid[x0][y0] grid[x0][y0] = grid[x1][y1] grid[x1][y1] = tmp # distance of current grid to target grid, defined as number of pieces that are # in the wrong position def distance(grid, move): swap(grid, move) diff = 0 for x in range(size): for y in range(size): diff += solvedGrid[x][y] != grid[x][y] swap(grid, (move, move)) return diff visited = [] toVisit = [grid] def bfs(): while len(toVisit) > 0: grid = toVisit.pop() visited.append(copy(grid)) showGrid(grid) sleep(500) if isSolved(grid): return grid moves = getMoves(grid) # sort according to score moves.sort(key = lambda e: distance(grid, e), reverse = True) for move in moves: swap(grid, move) if grid not in visited: toVisit.append(copy(grid)) swap(grid, (move, move)) showGrid(grid) grid = bfs() lightUp()
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!