def f(b):
Q,W=len(b),len(b[0]);q,d=[(0,0,[(0,0)],0)],{}
for x,y,p,c in q:
if Q-x==1==W-y:d[c]=p;continue
Z=lambda x:x in d and len(p)>=len(d[x])
for T in[(x+1,y),(x,y+1),(x-1,y),(x,y-1)]:
if(Q>T[0]>-1<T[1]<W)>(T in p)and((F:='#'!=b[T[0]][T[1]])>Z(c)or d=={}or(c<max(d))>Z(c+1)):q+=(*T,p+[T],c+1-F),
return d
s1 = """
..#..#..
"""
s2 = """
.#...
...#.
"""
s3 = """
....
....
....
....
"""
s4 = """
..#..
..#..
..#..
"""
s5 = """
.#.#.
##.##
.###.
"""
s6 = """
.......
######.
.......
.######
....#..
"""
s7 = """
.....#..
#######.
#######.
........
.#######
.#######
....#...
"""
def to_board(s):
return [[*i]for i in filter(None, s.split('\n'))]
def render_board(d,s):
b = to_board(s)
for x,y in d[min(d)]:b[x][y]='+'
return'\n'.join(''.join(i) for i in b)
print(render_board(f(to_board(s1)), s1))
print()
print(render_board(f(to_board(s2)), s2))
print()
print(render_board(f(to_board(s3)), s3))
print()
print(render_board(f(to_board(s4)), s4))
print()
print(render_board(f(to_board(s5)), s5))
print()
print(render_board(f(to_board(s6)), s6))
print()
print(render_board(f(to_board(s7)), s7))
ZGVmIGYoYik6CiBRLFc9bGVuKGIpLGxlbihiWzBdKTtxLGQ9WygwLDAsWygwLDApXSwwKV0se30KIGZvciB4LHkscCxjIGluIHE6CiAgaWYgUS14PT0xPT1XLXk6ZFtjXT1wO2NvbnRpbnVlCiAgWj1sYW1iZGEgeDp4IGluIGQgYW5kIGxlbihwKT49bGVuKGRbeF0pCiAgZm9yIFQgaW5bKHgrMSx5KSwoeCx5KzEpLCh4LTEseSksKHgseS0xKV06CiAgIGlmKFE+VFswXT4tMTxUWzFdPFcpPihUIGluIHApYW5kKChGOj0nIychPWJbVFswXV1bVFsxXV0pPlooYylvciBkPT17fW9yKGM8bWF4KGQpKT5aKGMrMSkpOnErPSgqVCxwK1tUXSxjKzEtRiksCiByZXR1cm4gZAogCnMxID0gIiIiCi4uIy4uIy4uCiIiIgpzMiA9ICIiIgouIy4uLgouLi4jLgoiIiIKczMgPSAiIiIKLi4uLgouLi4uCi4uLi4KLi4uLgoiIiIKczQgPSAiIiIKLi4jLi4KLi4jLi4KLi4jLi4KIiIiCgpzNSA9ICIiIgouIy4jLgojIy4jIwouIyMjLgoiIiIKCnM2ID0gIiIiCi4uLi4uLi4KIyMjIyMjLgouLi4uLi4uCi4jIyMjIyMKLi4uLiMuLgoiIiIKCnM3ID0gIiIiCi4uLi4uIy4uCiMjIyMjIyMuCiMjIyMjIyMuCi4uLi4uLi4uCi4jIyMjIyMjCi4jIyMjIyMjCi4uLi4jLi4uCiIiIgpkZWYgdG9fYm9hcmQocyk6CglyZXR1cm4gW1sqaV1mb3IgaSBpbiBmaWx0ZXIoTm9uZSwgcy5zcGxpdCgnXG4nKSldCgpkZWYgcmVuZGVyX2JvYXJkKGQscyk6CgliID0gdG9fYm9hcmQocykKCWZvciB4LHkgaW4gZFttaW4oZCldOmJbeF1beV09JysnCglyZXR1cm4nXG4nLmpvaW4oJycuam9pbihpKSBmb3IgaSBpbiBiKQoKcHJpbnQocmVuZGVyX2JvYXJkKGYodG9fYm9hcmQoczEpKSwgczEpKQpwcmludCgpCnByaW50KHJlbmRlcl9ib2FyZChmKHRvX2JvYXJkKHMyKSksIHMyKSkKcHJpbnQoKQpwcmludChyZW5kZXJfYm9hcmQoZih0b19ib2FyZChzMykpLCBzMykpCnByaW50KCkKcHJpbnQocmVuZGVyX2JvYXJkKGYodG9fYm9hcmQoczQpKSwgczQpKQpwcmludCgpCnByaW50KHJlbmRlcl9ib2FyZChmKHRvX2JvYXJkKHM1KSksIHM1KSkKcHJpbnQoKQpwcmludChyZW5kZXJfYm9hcmQoZih0b19ib2FyZChzNikpLCBzNikpCnByaW50KCkKcHJpbnQocmVuZGVyX2JvYXJkKGYodG9fYm9hcmQoczcpKSwgczcpKQo=