def O( b, x, y, X, Y) :
for A, B in [ ( 0 , 1 ) , ( 0 , -1 ) , ( 1 , 0 ) , ( -1 , 0 ) , ( 1 , 1 ) , ( 1 , -1 ) , ( -1 , 1 ) , ( -1 , -1 ) ] :
if X> ( j:= x+A) > -1 < ( k:= y+B) < Y and 'XX' != b[ j] [ k] :yield ( j, k, b[ j] [ k] )
def f( b) :
b= [ [ int ( j) if j.isdigit ( ) else j for j in i.split ( ) ] for i in b.split ( '\n ' ) ] ; u= len ( b) ; v= len ( b[ 0 ] ) ; k= [ ( X//v, X%v) for X in range ( u*v) ]
if len ( d:= [ ( x, y) for x, y in k if type ( b[ x] [ y] ) == int ] ) == 1 :return
s, e= min ( d, key= ( _:= lambda x:b[ x[ 0 ] ] [ x[ 1 ] ] ) ) , max ( d, key= _) ; q, a= [ ( s, { ( x, y) for x, y in k if b[ x] [ y] == '--' } , b) ] , [ ] ; D= [ b[ x] [ y] for x, y in d]
while q:
( X, Y) , W, B= q.pop ( 0 ) ; T= [ ]
if ( X, Y) == e and W== set ( ) :return '\n ' .join ( ' ' .join ( str ( j) .zfill ( 2 ) for j in i) for i in B)
for x, y, C in O( B, X, Y, u, v) :
if-~ B[ X] [ Y] == C:q+= ( ( x, y) , W, B) ,; T= [ ] ; break
if '--' == C and-~ B[ X] [ Y] not in D:
U= eval ( str ( B) ) ; U[ x] [ y] = B[ X] [ Y] +1
if ~ -( U in a) :T+= ( ( x, y) , W-{ ( x, y) } , U) ,; a+= U,
q+= T
print ( f( '01 XX 03' ) )
print ( f( '01 -- 04' ) )
print ( f( '01 --' ) )
print ( f( """01 -- --
-- XX 05""" ) )
print ( f( """-- 33 35 -- -- XX XX XX
-- -- 24 22 -- XX XX XX
-- -- -- 21 -- -- XX XX
-- 26 -- 13 40 11 XX XX
27 -- -- -- 09 -- 01 XX
XX XX -- -- 18 -- -- XX
XX XX XX XX -- 07 -- --
XX XX XX XX XX XX 05 --""" ) )
ZGVmIE8oYix4LHksWCxZKToKIGZvciBBLEIgaW5bKDAsMSksKDAsLTEpLCgxLDApLCgtMSwwKSwoMSwxKSwoMSwtMSksKC0xLDEpLCgtMSwtMSldOgogIGlmIFg+KGo6PXgrQSk+LTE8KGs6PXkrQik8WSBhbmQnWFgnIT1iW2pdW2tdOnlpZWxkKGosayxiW2pdW2tdKQpkZWYgZihiKToKIGI9W1tpbnQoailpZiBqLmlzZGlnaXQoKWVsc2UgaiBmb3IgaiBpbiBpLnNwbGl0KCldZm9yIGkgaW4gYi5zcGxpdCgnXG4nKV07dT1sZW4oYik7dj1sZW4oYlswXSk7az1bKFgvL3YsWCV2KWZvciBYIGluIHJhbmdlKHUqdildCiBpZiBsZW4oZDo9Wyh4LHkpZm9yIHgseSBpbiBrIGlmIHR5cGUoYlt4XVt5XSk9PWludF0pPT0xOnJldHVybgogcyxlPW1pbihkLGtleT0oXzo9bGFtYmRhIHg6Ylt4WzBdXVt4WzFdXSkpLG1heChkLGtleT1fKTtxLGE9WyhzLHsoeCx5KWZvciB4LHkgaW4gayBpZiBiW3hdW3ldPT0nLS0nfSxiKV0sW107RD1bYlt4XVt5XWZvciB4LHkgaW4gZF0KIHdoaWxlIHE6CiAgKFgsWSksVyxCPXEucG9wKDApO1Q9W10KICBpZihYLFkpPT1lIGFuZCBXPT1zZXQoKTpyZXR1cm4nXG4nLmpvaW4oJyAnLmpvaW4oc3RyKGopLnpmaWxsKDIpZm9yIGogaW4gaSlmb3IgaSBpbiBCKQogIGZvciB4LHksQyBpbiBPKEIsWCxZLHUsdik6CiAgIGlmLX5CW1hdW1ldPT1DOnErPSgoeCx5KSxXLEIpLDtUPVtdO2JyZWFrCiAgIGlmJy0tJz09QyBhbmQtfkJbWF1bWV1ub3QgaW4gRDoKICAgIFU9ZXZhbChzdHIoQikpO1VbeF1beV09QltYXVtZXSsxCiAgICBpZn4tKFUgaW4gYSk6VCs9KCh4LHkpLFcteyh4LHkpfSxVKSw7YSs9VSwKICBxKz1UCgpwcmludChmKCcwMSBYWCAwMycpKQpwcmludChmKCcwMSAtLSAwNCcpKQpwcmludChmKCcwMSAtLScpKQpwcmludChmKCIiIjAxIC0tIC0tCi0tIFhYIDA1IiIiKSkKcHJpbnQoZigiIiItLSAzMyAzNSAtLSAtLSBYWCBYWCBYWCAgICAKLS0gLS0gMjQgMjIgLS0gWFggWFggWFggICAgICAKLS0gLS0gLS0gMjEgLS0gLS0gWFggWFgKLS0gMjYgLS0gMTMgNDAgMTEgWFggWFgKMjcgLS0gLS0gLS0gMDkgLS0gMDEgWFgKWFggWFggLS0gLS0gMTggLS0gLS0gWFgKWFggWFggWFggWFggLS0gMDcgLS0gLS0KWFggWFggWFggWFggWFggWFggMDUgLS0iIiIpKQ==