def solution(src, dest): unvisited = [i for i in range(64)] curr_stage = set([src]) moves = 0 while dest not in curr_stage: next_stage = set() for curr in curr_stage: next_stage.update(possible_next_position(curr)) moves += 1 curr_stage = next_stage return moves def possible_next_position(curr): result = [] if curr % 8 >= 1: if curr / 8 >= 2: result += [curr-17] if curr / 8 <= 5: result += [curr+15] if curr % 8 >= 2: if curr / 8 >= 1: result += [curr-10] if curr / 8 <= 6: result += [curr+6] if curr % 8 <= 5: if curr / 8 >= 1: result += [curr-6] if curr / 8 <= 6: result += [curr+10] if curr % 8 <= 6: if curr / 8 >= 2: result += [curr-15] if curr / 8 <= 5: result += [curr+17] return set(result) tests = [ ([0, 1], 3), ([19, 36], 1), ([0, 0], 0), ] for i, o in tests: result = solution(*i) print(i, result == o, result, o)