import math
N= math .dist
E= enumerate
M= [ ( 0 , 1 ) , ( 1 , 0 ) , ( -1 , 0 ) , ( 0 , -1 ) , ( 1 , 1 ) , ( -1 , 1 ) , ( 1 , -1 ) , ( -1 , -1 ) ]
def f( b) :
d= { ( x, y) :v for x, r in E( b) for y, v in E( r) } ; q= [ ( [ i for i in d if ( '#' == d[ ( 1 , i[ 1 ] ) ] ) > i[ 0 ] ] [ :1 ] , 0 ) ]
for [ *P, z] , D in q:
if-~ len ( P) > len ( b[ 0 ] ) and any ( ( z[ 0 ] +X, z[ 1 ] +Y) == P[ 0 ] for X, Y in M) :
for X, Y in P+[ z] :b[ X] [ Y] = 'o'
return '\n ' .join ( map ( '' .join , b) )
elif O:= [ v for X, Y in M if '.' == d.get ( v:= ( z[ 0 ] +X, z[ 1 ] +Y) ) and ( v in P) < ( D or Y> 0 ) ] :q+= [ ( P+[ z, i] , D+N( i, z) ) for i in O if all ( G> D+N( z, i) for T, G in q if T[ -1 ] == i) ]
def to_board( s) :
return [ [ *i] for i in filter ( None , s.split ( '\n ' ) ) ]
s = """
........
....##..
...####.
..###...
.#####..
.#####..
..##....
........
"""
s1 = """
...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........
"""
s2 = """
...
.#.
...
"""
s3 = """
......
.####.
......
"""
s4 = """
......
..##..
...#..
......
......
"""
s5 = """
.......
.#####.
...#...
...#...
.#####.
.......
"""
s6 = """
.......
...#...
...#...
.#####.
...#...
...#...
.......
"""
s7 = """
.......
.#####.
.##..#.
..#..#.
.......
"""
s8 = """
........................
.............#..........
...........#.#.##...#...
...........#.#.###.##...
..........########.##...
..........############..
.....#....############..
...#.###.##############.
..##.##################.
..####################..
...##################...
..##################....
....################....
.###################....
.#####################..
..##################....
.####################...
.#...##############.....
.##...#############.....
.#.....###....#.........
.......#................
........................
"""
print ( f( to_board( s) ) )
print ( '-' *50 )
print ( f( to_board( s1) ) )
print ( '-' *50 )
print ( f( to_board( s2) ) )
print ( '-' *50 )
print ( f( to_board( s3) ) )
print ( '-' *50 )
print ( f( to_board( s4) ) )
print ( '-' *50 )
print ( f( to_board( s5) ) )
print ( '-' *50 )
print ( f( to_board( s6) ) )
print ( '-' *50 )
print ( f( to_board( s7) ) )
print ( '-' *50 )
print ( f( to_board( s8) ) )
aW1wb3J0IG1hdGgKTj1tYXRoLmRpc3QKRT1lbnVtZXJhdGUKTT1bKDAsMSksKDEsMCksKC0xLDApLCgwLC0xKSwoMSwxKSwoLTEsMSksKDEsLTEpLCgtMSwtMSldCmRlZiBmKGIpOgogZD17KHgseSk6diBmb3IgeCxyIGluIEUoYilmb3IgeSx2IGluIEUocil9O3E9WyhbaSBmb3IgaSBpbiBkIGlmKCcjJz09ZFsoMSxpWzFdKV0pPmlbMF1dWzoxXSwwKV0KIGZvclsqUCx6XSxEIGluIHE6CiAgaWYtfmxlbihQKT5sZW4oYlswXSlhbmQgYW55KCh6WzBdK1gselsxXStZKT09UFswXWZvciBYLFkgaW4gTSk6CiAgIGZvciBYLFkgaW4gUCtbel06YltYXVtZXT0nbycKICAgcmV0dXJuJ1xuJy5qb2luKG1hcCgnJy5qb2luLGIpKQogIGVsaWYgTzo9W3YgZm9yIFgsWSBpbiBNIGlmJy4nPT1kLmdldCh2Oj0oelswXStYLHpbMV0rWSkpYW5kKHYgaW4gUCk8KEQgb3IgWT4wKV06cSs9WyhQK1t6LGldLEQrTihpLHopKWZvciBpIGluIE8gaWYgYWxsKEc+RCtOKHosaSlmb3IgVCxHIGluIHEgaWYgVFstMV09PWkpXQogIApkZWYgdG9fYm9hcmQocyk6CglyZXR1cm4gW1sqaV0gZm9yIGkgaW4gZmlsdGVyKE5vbmUsIHMuc3BsaXQoJ1xuJykpXQoKcyA9ICIiIgouLi4uLi4uLgouLi4uIyMuLgouLi4jIyMjLgouLiMjIy4uLgouIyMjIyMuLgouIyMjIyMuLgouLiMjLi4uLgouLi4uLi4uLgoiIiIKCnMxID0gIiIiCi4uLi4uLi4uLi4uCi4uLiMjLi4uLi4uCi4uIyMjIyMuLi4uCi4uIyMjIyMjIy4uCi4jIyMjIyMjIyMuCi4uLiMjIyMjIyMuCi4uLiMjIyMjLiMuCi4uLi4jIyMjLi4uCi4uLi4uLi4uLi4uCiIiIgpzMiA9ICIiIgouLi4KLiMuCi4uLgoiIiIKczMgPSAiIiIKLi4uLi4uCi4jIyMjLgouLi4uLi4KIiIiCnM0ID0gIiIiCi4uLi4uLgouLiMjLi4KLi4uIy4uCi4uLi4uLgouLi4uLi4KIiIiCnM1ID0gIiIiCi4uLi4uLi4KLiMjIyMjLgouLi4jLi4uCi4uLiMuLi4KLiMjIyMjLgouLi4uLi4uCiIiIgpzNiA9ICIiIgouLi4uLi4uCi4uLiMuLi4KLi4uIy4uLgouIyMjIyMuCi4uLiMuLi4KLi4uIy4uLgouLi4uLi4uCiIiIgpzNyA9ICIiIgouLi4uLi4uCi4jIyMjIy4KLiMjLi4jLgouLiMuLiMuCi4uLi4uLi4KIiIiCnM4ID0gIiIiCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgouLi4uLi4uLi4uLi4uIy4uLi4uLi4uLi4KLi4uLi4uLi4uLi4jLiMuIyMuLi4jLi4uCi4uLi4uLi4uLi4uIy4jLiMjIy4jIy4uLgouLi4uLi4uLi4uIyMjIyMjIyMuIyMuLi4KLi4uLi4uLi4uLiMjIyMjIyMjIyMjIy4uCi4uLi4uIy4uLi4jIyMjIyMjIyMjIyMuLgouLi4jLiMjIy4jIyMjIyMjIyMjIyMjIy4KLi4jIy4jIyMjIyMjIyMjIyMjIyMjIyMuCi4uIyMjIyMjIyMjIyMjIyMjIyMjIyMuLgouLi4jIyMjIyMjIyMjIyMjIyMjIyMuLi4KLi4jIyMjIyMjIyMjIyMjIyMjIyMuLi4uCi4uLi4jIyMjIyMjIyMjIyMjIyMjLi4uLgouIyMjIyMjIyMjIyMjIyMjIyMjIy4uLi4KLiMjIyMjIyMjIyMjIyMjIyMjIyMjIy4uCi4uIyMjIyMjIyMjIyMjIyMjIyMjLi4uLgouIyMjIyMjIyMjIyMjIyMjIyMjIyMuLi4KLiMuLi4jIyMjIyMjIyMjIyMjIy4uLi4uCi4jIy4uLiMjIyMjIyMjIyMjIyMuLi4uLgouIy4uLi4uIyMjLi4uLiMuLi4uLi4uLi4KLi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4uCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoiIiIKcHJpbnQoZih0b19ib2FyZChzKSkpCnByaW50KCctJyo1MCkKcHJpbnQoZih0b19ib2FyZChzMSkpKQpwcmludCgnLScqNTApCnByaW50KGYodG9fYm9hcmQoczIpKSkKcHJpbnQoJy0nKjUwKQpwcmludChmKHRvX2JvYXJkKHMzKSkpCnByaW50KCctJyo1MCkKcHJpbnQoZih0b19ib2FyZChzNCkpKQpwcmludCgnLScqNTApCnByaW50KGYodG9fYm9hcmQoczUpKSkKcHJpbnQoJy0nKjUwKQpwcmludChmKHRvX2JvYXJkKHM2KSkpCnByaW50KCctJyo1MCkKcHJpbnQoZih0b19ib2FyZChzNykpKQpwcmludCgnLScqNTApCnByaW50KGYodG9fYm9hcmQoczgpKSk=