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
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QsIHBlcm11dGF0aW9ucwoKY2xhc3MgdmVjdG9yKGNvbXBsZXgpOgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnKHt9LCB7fSknLmZvcm1hdChpbnQoc2VsZi5yZWFsKSwgaW50KHNlbGYuaW1hZykpCiAgICAKZGVmIGtuaWdodHNfbWV0cmljKHRhcmdldF94LCB0YXJnZXRfeSwgc3RhcnRfeD0wLCBzdGFydF95PTApOgogICAgdGFyZ2V0ID0gdmVjdG9yKHRhcmdldF94LCB0YXJnZXRfeSkKICAgIHBvc3NpYmxlID0gW3ZlY3RvcihzaWduX3ggKiBkZWx0YV94LCBzaWduX3kgKiBkZWx0YV95KQogICAgICAgICAgICAgICAgZm9yIHNpZ25feCwgc2lnbl95IGluIHByb2R1Y3QoKDEsIC0xKSwgcmVwZWF0PTIpCiAgICAgICAgICAgICAgICBmb3IgZGVsdGFfeCwgZGVsdGFfeSBpbiBwZXJtdXRhdGlvbnMoKDEsIDIpKV0KICAgIHZpc2l0ZWQgPSB7dmVjdG9yKHN0YXJ0X3gsIHN0YXJ0X3kpOiBbXX0KICAgIHdoaWxlIFRydWU6CiAgICAgICAgZm9yIG1vdmUsIHN0YXJ0IGluIHByb2R1Y3QocG9zc2libGUsIHZpc2l0ZWQpOgogICAgICAgICAgICBpZiB0YXJnZXQgaW4gdmlzaXRlZDoKICAgICAgICAgICAgICAgIHJldHVybiBsZW4odmlzaXRlZFt0YXJnZXRdKSwgdmlzaXRlZFt0YXJnZXRdCiAgICAgICAgICAgIGVuZCA9IG1vdmUgKyBzdGFydAogICAgICAgICAgICBpZiBlbmQgbm90IGluIHZpc2l0ZWQ6CiAgICAgICAgICAgICAgICB2aXNpdGVkW2VuZF0gPSB2aXNpdGVkW3N0YXJ0XSArIFttb3ZlXQoKIyBUZXN0aW5nCmNhc2VzID0gWygoMCwgMCksIDApLCAoKDAsIDEpLCAzKSwgKCgzLCA3KSwgNCksICgoOCwgNyksIDUpLCAoKDEzLCAxMiksIDkpXQpmb3IgYXJncywgZXhwZWN0ZWQgaW4gY2FzZXM6CiAgICBuLCBwYXRoID0ga25pZ2h0c19tZXRyaWMoKmFyZ3MpCiAgICBwcmludCAne306IHt9IHt9Jy5mb3JtYXQoYXJncywgbiwgcGF0aCkKICAgIGFzc2VydCBuID09IGV4cGVjdGVk
(0, 0): 0 []
(0, 1): 3 [(-2, 1), (1, -2), (1, 2)]
(3, 7): 4 [(-1, 2), (2, 1), (1, 2), (1, 2)]
(8, 7): 5 [(2, 1), (2, 1), (2, 1), (1, 2), (1, 2)]
(13, 12): 9 [(2, -1), (2, 1), (2, 1), (2, 1), (1, 2), (1, 2), (1, 2), (1, 2), (1, 2)]