def f( p) :
R= [ ]
while p:
c= [ ( x, y) for x, y in p if-1 > sum ( ~ -( X in p) for X in [ ( x, y+1 ) , ( x, y-1 ) , ( x+1 , y) , ( x-1 , y) ] ) ] [ 0 ] ; r= { c, *( F:= lambda x, y, X, Y:{ V, *F( *V, X, Y) } if ( V:= ( x+X, y+Y) ) in p else { ( x, y) } ) ( *c, 0 , 1 ) , *F( *c, 0 , -1 ) } ; p-= { *r} ; r= [ r]
while u:= 1 :
for t, X in ( 0 , 1 ) , ( -1 , -1 ) :
if len ( K:= [ V for x, y in r[ t] if ( V:= ( x+X, y) ) in p] ) == len ( r[ 0 ] ) :r= [ [ K] +r, r+[ K] ] [ abs ( t) ] ; p-= { *K} ; u= 0
if u:R+= r,; break
return R
import string
def viz( p) :
x, y= map ( max , zip ( *p) )
board = [ [ 0 for _ in range ( x+3 ) ] for _ in range ( y+3 ) ]
S = string .ascii_lowercase
for i, r in enumerate ( f( p) ) :
for _r in r:
for x, y in _r: board[ x] [ y] = S[ i]
print ( '\n ' .join ( [ '' .join ( map ( lambda x:str ( x) if x else ' ' , u) ) for u in board] ) )
viz( { ( 0 , 0 ) , ( 1 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) , ( 2 , 1 ) , ( 1 , 2 ) , ( 2 , 2 ) } )
print ( '-' *50 )
viz( { ( 0 , 0 ) , ( 0 , 1 ) , ( 0 , 2 ) , ( 0 , 3 ) , ( 0 , 4 ) , ( 0 , 5 ) , ( 1 , 0 ) , ( 1 , 1 ) , ( 1 , 2 ) , ( 1 , 3 ) , ( 1 , 4 ) , ( 1 , 5 ) , ( 2 , 0 ) , ( 2 , 1 ) , ( 3 , 0 ) , ( 3 , 1 ) , ( 4 , 0 ) , ( 4 , 1 ) , ( 4 , 2 ) , ( 4 , 3 ) , ( 4 , 4 ) , ( 4 , 5 ) , ( 5 , 0 ) , ( 5 , 1 ) , ( 5 , 2 ) , ( 5 , 3 ) , ( 5 , 4 ) , ( 5 , 5 ) } )
print ( '-' *50 )
viz( { ( 0 , 0 ) , ( 0 , 1 ) , ( 0 , 2 ) , ( 0 , 3 ) , ( 0 , 4 ) , ( 0 , 5 ) , ( 0 , 6 ) , ( 0 , 7 ) , ( 0 , 8 ) , ( 0 , 9 ) , ( 1 , 0 ) , ( 1 , 1 ) , ( 1 , 2 ) , ( 1 , 3 ) , ( 1 , 4 ) , ( 1 , 5 ) , ( 1 , 6 ) , ( 1 , 7 ) , ( 1 , 8 ) , ( 2 , 0 ) , ( 2 , 1 ) , ( 2 , 2 ) , ( 2 , 3 ) , ( 2 , 4 ) , ( 2 , 5 ) , ( 2 , 6 ) , ( 2 , 7 ) , ( 3 , 0 ) , ( 3 , 1 ) , ( 3 , 2 ) , ( 3 , 3 ) , ( 3 , 4 ) , ( 3 , 5 ) , ( 3 , 6 ) , ( 4 , 0 ) , ( 4 , 1 ) , ( 4 , 2 ) , ( 4 , 3 ) , ( 4 , 4 ) , ( 4 , 5 ) , ( 5 , 0 ) , ( 5 , 1 ) , ( 5 , 2 ) , ( 5 , 3 ) , ( 5 , 4 ) , ( 6 , 0 ) , ( 6 , 1 ) , ( 6 , 2 ) , ( 6 , 3 ) , ( 7 , 0 ) , ( 7 , 1 ) , ( 7 , 2 ) , ( 8 , 0 ) , ( 8 , 1 ) , ( 9 , 0 ) } )
print ( '-' *50 )
viz( { ( 0 , 0 ) , ( 0 , 1 ) , ( 0 , 2 ) , ( 0 , 3 ) , ( 0 , 4 ) , ( 0 , 5 ) , ( 0 , 6 ) , ( 0 , 7 ) , ( 0 , 8 ) , ( 1 , 0 ) , ( 1 , 1 ) , ( 1 , 2 ) , ( 1 , 3 ) , ( 1 , 4 ) , ( 1 , 5 ) , ( 1 , 6 ) , ( 1 , 7 ) , ( 1 , 8 ) , ( 1 , 9 ) , ( 2 , 0 ) , ( 2 , 1 ) , ( 2 , 2 ) , ( 2 , 3 ) , ( 2 , 4 ) , ( 2 , 5 ) , ( 2 , 6 ) , ( 2 , 7 ) , ( 2 , 8 ) , ( 2 , 9 ) , ( 3 , 0 ) , ( 3 , 1 ) , ( 3 , 2 ) , ( 3 , 4 ) , ( 3 , 5 ) , ( 3 , 6 ) , ( 3 , 7 ) , ( 3 , 8 ) , ( 3 , 9 ) , ( 4 , 0 ) , ( 4 , 1 ) , ( 4 , 2 ) , ( 4 , 3 ) , ( 4 , 4 ) , ( 4 , 5 ) , ( 4 , 6 ) , ( 4 , 7 ) , ( 4 , 8 ) , ( 4 , 9 ) , ( 5 , 0 ) , ( 5 , 1 ) , ( 5 , 2 ) , ( 5 , 3 ) , ( 5 , 4 ) , ( 5 , 5 ) , ( 5 , 7 ) , ( 5 , 8 ) , ( 5 , 9 ) , ( 6 , 1 ) , ( 6 , 2 ) , ( 6 , 3 ) , ( 6 , 5 ) , ( 6 , 6 ) , ( 6 , 7 ) , ( 6 , 8 ) , ( 6 , 9 ) , ( 7 , 0 ) , ( 7 , 1 ) , ( 7 , 2 ) , ( 7 , 3 ) , ( 7 , 4 ) , ( 7 , 5 ) , ( 7 , 6 ) , ( 7 , 7 ) , ( 7 , 8 ) , ( 7 , 9 ) , ( 8 , 0 ) , ( 8 , 1 ) , ( 8 , 2 ) , ( 8 , 3 ) , ( 8 , 4 ) , ( 8 , 5 ) , ( 8 , 6 ) , ( 8 , 7 ) , ( 8 , 8 ) , ( 8 , 9 ) , ( 9 , 0 ) , ( 9 , 1 ) , ( 9 , 2 ) , ( 9 , 3 ) , ( 9 , 4 ) , ( 9 , 5 ) , ( 9 , 6 ) , ( 9 , 7 ) , ( 9 , 8 ) , ( 9 , 9 ) } )
print ( '-' *50 )
viz( { ( 0 , 0 ) , ( 0 , 1 ) , ( 0 , 2 ) , ( 0 , 3 ) , ( 0 , 4 ) , ( 0 , 5 ) , ( 0 , 6 ) , ( 0 , 7 ) , ( 0 , 8 ) , ( 1 , 0 ) , ( 1 , 1 ) , ( 1 , 2 ) , ( 1 , 3 ) , ( 1 , 4 ) , ( 1 , 6 ) , ( 1 , 7 ) , ( 1 , 8 ) , ( 1 , 9 ) , ( 2 , 1 ) , ( 2 , 2 ) , ( 2 , 3 ) , ( 2 , 4 ) , ( 2 , 5 ) , ( 2 , 6 ) , ( 2 , 7 ) , ( 2 , 8 ) , ( 2 , 9 ) , ( 4 , 0 ) , ( 4 , 1 ) , ( 4 , 2 ) , ( 4 , 4 ) , ( 4 , 5 ) , ( 4 , 6 ) , ( 4 , 7 ) , ( 4 , 8 ) , ( 4 , 9 ) , ( 5 , 0 ) , ( 5 , 1 ) , ( 5 , 2 ) , ( 5 , 3 ) , ( 5 , 4 ) , ( 5 , 5 ) , ( 5 , 6 ) , ( 5 , 7 ) , ( 5 , 8 ) , ( 5 , 9 ) , ( 6 , 0 ) , ( 6 , 1 ) , ( 6 , 2 ) , ( 6 , 4 ) , ( 6 , 5 ) , ( 6 , 6 ) , ( 6 , 7 ) , ( 6 , 8 ) , ( 6 , 9 ) , ( 8 , 0 ) , ( 8 , 1 ) , ( 8 , 2 ) , ( 8 , 3 ) , ( 8 , 4 ) , ( 8 , 5 ) , ( 8 , 6 ) , ( 8 , 7 ) , ( 8 , 8 ) , ( 8 , 9 ) , ( 9 , 0 ) , ( 9 , 1 ) , ( 9 , 2 ) , ( 9 , 3 ) , ( 9 , 7 ) , ( 9 , 8 ) , ( 9 , 9 ) , ( 10 , 0 ) , ( 10 , 1 ) , ( 10 , 2 ) , ( 10 , 3 ) , ( 10 , 4 ) , ( 10 , 5 ) , ( 10 , 6 ) , ( 10 , 7 ) , ( 10 , 8 ) , ( 10 , 9 ) } )
ZGVmIGYocCk6CiBSPVtdCiB3aGlsZSBwOgogIGM9Wyh4LHkpZm9yIHgseSBpbiBwIGlmLTE+c3VtKH4tKFggaW4gcClmb3IgWCBpblsoeCx5KzEpLCh4LHktMSksKHgrMSx5KSwoeC0xLHkpXSldWzBdO3I9e2MsKihGOj1sYW1iZGEgeCx5LFgsWTp7ViwqRigqVixYLFkpfWlmKFY6PSh4K1gseStZKSlpbiBwIGVsc2V7KHgseSl9KSgqYywwLDEpLCpGKCpjLDAsLTEpfTtwLT17KnJ9O3I9W3JdCiAgd2hpbGUgdTo9MToKICAgZm9yIHQsWCBpbigwLDEpLCgtMSwtMSk6CiAgICBpZiBsZW4oSzo9W1YgZm9yIHgseSBpbiByW3RdaWYoVjo9KHgrWCx5KSlpbiBwXSk9PWxlbihyWzBdKTpyPVtbS10rcixyK1tLXV1bYWJzKHQpXTtwLT17Kkt9O3U9MAogICBpZiB1OlIrPXIsO2JyZWFrCiByZXR1cm4gUgogCmltcG9ydCBzdHJpbmcKZGVmIHZpeihwKToKCXgseT1tYXAobWF4LHppcCgqcCkpCglib2FyZCA9IFtbMCBmb3IgXyBpbiByYW5nZSh4KzMpXWZvciBfIGluIHJhbmdlKHkrMyldCglTID0gc3RyaW5nLmFzY2lpX2xvd2VyY2FzZQoJZm9yIGksciBpbiBlbnVtZXJhdGUoZihwKSk6CgkJZm9yIF9yIGluIHI6CgkJCWZvciB4LHkgaW4gX3I6IGJvYXJkW3hdW3ldPVNbaV0KCglwcmludCgnXG4nLmpvaW4oWycnLmpvaW4obWFwKGxhbWJkYSB4OnN0cih4KWlmIHggZWxzZScgJywgdSkpZm9yIHUgaW4gYm9hcmRdKSkKCgp2aXooeygwLDApLCgxLDApLCgwLDEpLCgxLDEpLCgyLDEpLCgxLDIpLCgyLDIpfSkKcHJpbnQoJy0nKjUwKQp2aXooeygwLDApLCgwLDEpLCgwLDIpLCgwLDMpLCgwLDQpLCgwLDUpLCgxLDApLCgxLDEpLCgxLDIpLCgxLDMpLCgxLDQpLCgxLDUpLCgyLDApLCgyLDEpLCgzLDApLCgzLDEpLCg0LDApLCg0LDEpLCg0LDIpLCg0LDMpLCg0LDQpLCg0LDUpLCg1LDApLCg1LDEpLCg1LDIpLCg1LDMpLCg1LDQpLCg1LDUpfSkKcHJpbnQoJy0nKjUwKQp2aXooeygwLDApLCgwLDEpLCgwLDIpLCgwLDMpLCgwLDQpLCgwLDUpLCgwLDYpLCgwLDcpLCgwLDgpLCgwLDkpLCgxLDApLCgxLDEpLCgxLDIpLCgxLDMpLCgxLDQpLCgxLDUpLCgxLDYpLCgxLDcpLCgxLDgpLCgyLDApLCgyLDEpLCgyLDIpLCgyLDMpLCgyLDQpLCgyLDUpLCgyLDYpLCgyLDcpLCgzLDApLCgzLDEpLCgzLDIpLCgzLDMpLCgzLDQpLCgzLDUpLCgzLDYpLCg0LDApLCg0LDEpLCg0LDIpLCg0LDMpLCg0LDQpLCg0LDUpLCg1LDApLCg1LDEpLCg1LDIpLCg1LDMpLCg1LDQpLCg2LDApLCg2LDEpLCg2LDIpLCg2LDMpLCg3LDApLCg3LDEpLCg3LDIpLCg4LDApLCg4LDEpLCg5LDApfSkKcHJpbnQoJy0nKjUwKQp2aXooeygwLDApLCgwLDEpLCgwLDIpLCgwLDMpLCgwLDQpLCgwLDUpLCgwLDYpLCgwLDcpLCgwLDgpLCgxLDApLCgxLDEpLCgxLDIpLCgxLDMpLCgxLDQpLCgxLDUpLCgxLDYpLCgxLDcpLCgxLDgpLCgxLDkpLCgyLDApLCgyLDEpLCgyLDIpLCgyLDMpLCgyLDQpLCgyLDUpLCgyLDYpLCgyLDcpLCgyLDgpLCgyLDkpLCgzLDApLCgzLDEpLCgzLDIpLCgzLDQpLCgzLDUpLCgzLDYpLCgzLDcpLCgzLDgpLCgzLDkpLCg0LDApLCg0LDEpLCg0LDIpLCg0LDMpLCg0LDQpLCg0LDUpLCg0LDYpLCg0LDcpLCg0LDgpLCg0LDkpLCg1LDApLCg1LDEpLCg1LDIpLCg1LDMpLCg1LDQpLCg1LDUpLCg1LDcpLCg1LDgpLCg1LDkpLCg2LDEpLCg2LDIpLCg2LDMpLCg2LDUpLCg2LDYpLCg2LDcpLCg2LDgpLCg2LDkpLCg3LDApLCg3LDEpLCg3LDIpLCg3LDMpLCg3LDQpLCg3LDUpLCg3LDYpLCg3LDcpLCg3LDgpLCg3LDkpLCg4LDApLCg4LDEpLCg4LDIpLCg4LDMpLCg4LDQpLCg4LDUpLCg4LDYpLCg4LDcpLCg4LDgpLCg4LDkpLCg5LDApLCg5LDEpLCg5LDIpLCg5LDMpLCg5LDQpLCg5LDUpLCg5LDYpLCg5LDcpLCg5LDgpLCg5LDkpfSkKcHJpbnQoJy0nKjUwKQp2aXooeygwLDApLCgwLDEpLCgwLDIpLCgwLDMpLCgwLDQpLCgwLDUpLCgwLDYpLCgwLDcpLCgwLDgpLCgxLDApLCgxLDEpLCgxLDIpLCgxLDMpLCgxLDQpLCgxLDYpLCgxLDcpLCgxLDgpLCgxLDkpLCgyLDEpLCgyLDIpLCgyLDMpLCgyLDQpLCgyLDUpLCgyLDYpLCgyLDcpLCgyLDgpLCgyLDkpLCg0LDApLCg0LDEpLCg0LDIpLCg0LDQpLCg0LDUpLCg0LDYpLCg0LDcpLCg0LDgpLCg0LDkpLCg1LDApLCg1LDEpLCg1LDIpLCg1LDMpLCg1LDQpLCg1LDUpLCg1LDYpLCg1LDcpLCg1LDgpLCg1LDkpLCg2LDApLCg2LDEpLCg2LDIpLCg2LDQpLCg2LDUpLCg2LDYpLCg2LDcpLCg2LDgpLCg2LDkpLCg4LDApLCg4LDEpLCg4LDIpLCg4LDMpLCg4LDQpLCg4LDUpLCg4LDYpLCg4LDcpLCg4LDgpLCg4LDkpLCg5LDApLCg5LDEpLCg5LDIpLCg5LDMpLCg5LDcpLCg5LDgpLCg5LDkpLCgxMCwwKSwoMTAsMSksKDEwLDIpLCgxMCwzKSwoMTAsNCksKDEwLDUpLCgxMCw2KSwoMTAsNyksKDEwLDgpLCgxMCw5KX0pCg==