from itertools import product, permutations

class vector(complex):
    def __repr__(self):
        return '({}, {})'.format(int(self.real), int(self.imag))
    
def knights_metric(target_x, target_y, start_x=0, start_y=0):
    target = vector(target_x, target_y)
    possible = [vector(sign_x * delta_x, sign_y * delta_y)
                for sign_x, sign_y in product((1, -1), repeat=2)
                for delta_x, delta_y in permutations((1, 2))]
    visited = {vector(start_x, start_y): []}
    while True:
        for move, start in product(possible, visited):
            if target in visited:
                return len(visited[target]), visited[target]
            end = move + start
            if end not in visited:
                visited[end] = visited[start] + [move]

# Testing
cases = [((0, 0), 0), ((0, 1), 3), ((3, 7), 4), ((8, 7), 5), ((13, 12), 9)]
for args, expected in cases:
    n, path = knights_metric(*args)
    print '{}: {} {}'.format(args, n, path)
    assert n == expected