A= abs
M= [ ( 0 , 1 ) , ( 0 , -1 ) , ( 1 , 0 ) , ( -1 , 0 ) ]
def F( b, x, y, X, Y, s) :
q= [ z:= ( X, Y) ] ; s+= z,
while q:
X, Y= q.pop ( 0 )
for J, K in M:
if ( ( U:= ( X+J, Y+K) ) in s) < ( ' ' == b[ X+J] [ Y+K] ) :yield ( *U, ( J, K) ) ; q+= U,; s+= U,
def f( b, c, C) :
( y, x) , ( Y, X) = c, C; q= [ ( X, Y, *( [ [ ( -1 , 0 ) , ( 1 , 0 ) ] [ x< X] , [ ( 0 , -1 ) , ( 0 , 1 ) ] [ y< Y] ] [ x== X] ) , [ ] ) ]
while q:
X, Y, j, k, s= q.pop ( 0 ) ; w= A( z:= x-X) +A( Z:= y-Y) ; P= w> 2 ; T= [ ( ( J, K) , any ( B!= ( J, K) for B in F( b, x, y, X+J, Y+K, [ ( X, Y) ] ) ) ) for J, K in M if ( ( X+J, Y+K) in s) < ( ' ' == b[ X+J] [ Y+K] ) and w< A( z-J) +A( Z-K) ] ; T= [ ( a, b) for a, b in T if ~ -any ( B for _, B in T) -b]
if [ ] == T or ( len ( T) == 1 > T[ 0 ] [ 1 ] or any ( i[ 0 ] != ( j, k) for i in T) ) *P:return ( X, Y)
if ( K:= [ ( 0 , j) , ( -k, 0 ) ] [ k> 0 ] ) in [ i[ 0 ] for i in T] *P:return ( X+K[ 0 ] , Y+K[ 1 ] )
for ( J, K) , _ in T:q+= ( X+J, Y+K, J, K, s+[ ( X+J, Y+K) ] ) ,
def to_board( S) :
return [ [ *i] for i in filter ( None , S.split ( '\n ' ) ) ]
s1 = """
#############
######## # ##
####### #
########## ##
## P B #
#### ########
#############
"""
s2 = """
#############
######## # ##
####### #
########## ##
## P B #
#### ########
#############
"""
s3 = """
############################
#P B #
######################### ##
############################
"""
s4 = """
######
### ##
#P B##
### #
######
"""
s5 = """
#######
### ##
## B###
## ###
###P###
#######
"""
s6 = """
#######
#P B #
#######
"""
s7 = """
#######
# P B #
#######
"""
s8 = """
#######
# PB #
#######
"""
print ( f( to_board( s1) , ( 5 , 4 ) , ( 7 , 4 ) ) )
print ( f( to_board( s2) , ( 8 , 4 ) , ( 10 , 4 ) ) )
print ( f( to_board( s3) , ( 1 , 1 ) , ( 3 , 1 ) ) )
print ( f( to_board( s4) , ( 1 , 2 ) , ( 3 , 2 ) ) )
print ( f( to_board( s5) , ( 3 , 4 ) , ( 3 , 2 ) ) )
print ( f( to_board( s6) , ( 1 , 1 ) , ( 4 , 1 ) ) )
print ( f( to_board( s7) , ( 2 , 1 ) , ( 4 , 1 ) ) )
print ( f( to_board( s7) , ( 3 , 1 ) , ( 4 , 1 ) ) )
QT1hYnMKTT1bKDAsMSksKDAsLTEpLCgxLDApLCgtMSwwKV0KZGVmIEYoYix4LHksWCxZLHMpOgogcT1bejo9KFgsWSldO3MrPXosCiB3aGlsZSBxOgogIFgsWT1xLnBvcCgwKQogIGZvciBKLEsgaW4gTToKICAgaWYoKFU6PShYK0osWStLKSlpbiBzKTwoJyAnPT1iW1grSl1bWStLXSk6eWllbGQoKlUsKEosSykpO3ErPVUsO3MrPVUsCmRlZiBmKGIsYyxDKToKICh5LHgpLChZLFgpPWMsQztxPVsoWCxZLCooW1soLTEsMCksKDEsMCldW3g8WF0sWygwLC0xKSwoMCwxKV1beTxZXV1beD09WF0pLFtdKV0KIHdoaWxlIHE6CiAgWCxZLGosayxzPXEucG9wKDApO3c9QSh6Oj14LVgpK0EoWjo9eS1ZKTtQPXc+MjtUPVsoKEosSyksYW55KEIhPShKLEspZm9yIEIgaW4gRihiLHgseSxYK0osWStLLFsoWCxZKV0pKSlmb3IgSixLIGluIE0gaWYoKFgrSixZK0spaW4gcyk8KCcgJz09YltYK0pdW1krS10pYW5kIHc8QSh6LUopK0EoWi1LKV07VD1bKGEsYilmb3IgYSxiIGluIFQgaWZ+LWFueShCIGZvciBfLEIgaW4gVCktYl0KICBpZltdPT1UIG9yKGxlbihUKT09MT5UWzBdWzFdb3IgYW55KGlbMF0hPShqLGspZm9yIGkgaW4gVCkpKlA6cmV0dXJuKFgsWSkKICBpZihLOj1bKDAsaiksKC1rLDApXVtrPjBdKWluW2lbMF1mb3IgaSBpbiBUXSpQOnJldHVybihYK0tbMF0sWStLWzFdKQogIGZvcihKLEspLF8gaW4gVDpxKz0oWCtKLFkrSyxKLEsscytbKFgrSixZK0spXSksCiAgCmRlZiB0b19ib2FyZChTKToKCXJldHVybltbKmldZm9yIGkgaW4gZmlsdGVyKE5vbmUsIFMuc3BsaXQoJ1xuJykpXQpzMSA9ICIiIgojIyMjIyMjIyMjIyMjCiMjIyMjIyMjICMgIyMKIyMjIyMjIyAgICAgIwojIyMjIyMjIyMjICMjCiMjICAgUCBCICAgICMKIyMjIyAjIyMjIyMjIwojIyMjIyMjIyMjIyMjCiIiIgpzMiA9ICIiIgojIyMjIyMjIyMjIyMjCiMjIyMjIyMjICMgIyMKIyMjIyMjIyAgICAgIwojIyMjIyMjIyMjICMjCiMjICAgICAgUCBCICMKIyMjIyAjIyMjIyMjIwojIyMjIyMjIyMjIyMjCiIiIgpzMyA9ICIiIgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiNQIEIgICAgICAgICAgICAgICAgICAgICAgICMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiIiIgpzNCA9ICIiIgojIyMjIyMKIyMjICMjCiNQIEIjIwojIyMgICMKIyMjIyMjCiIiIgpzNSA9ICIiIgojIyMjIyMjCiMjIyAgIyMKIyMgQiMjIwojIyAgIyMjCiMjI1AjIyMKIyMjIyMjIwoiIiIKczYgPSAiIiIKIyMjIyMjIwojUCAgQiAjCiMjIyMjIyMKIiIiCnM3ID0gIiIiCiMjIyMjIyMKIyBQIEIgIwojIyMjIyMjCiIiIgpzOCA9ICIiIgojIyMjIyMjCiMgIFBCICMKIyMjIyMjIwoiIiIKcHJpbnQoZih0b19ib2FyZChzMSksKDUsIDQpLCg3LCA0KSkpCnByaW50KGYodG9fYm9hcmQoczIpLCg4LCA0KSwoMTAsIDQpKSkKcHJpbnQoZih0b19ib2FyZChzMyksKDEsIDEpLCgzLCAxKSkpCnByaW50KGYodG9fYm9hcmQoczQpLCgxLCAyKSwoMywgMikpKQpwcmludChmKHRvX2JvYXJkKHM1KSwoMywgNCksKDMsIDIpKSkKcHJpbnQoZih0b19ib2FyZChzNiksKDEsIDEpLCg0LCAxKSkpCnByaW50KGYodG9fYm9hcmQoczcpLCgyLCAxKSwoNCwgMSkpKQpwcmludChmKHRvX2JvYXJkKHM3KSwoMywgMSksKDQsIDEpKSk=