E=enumerate
W=lambda d,v:[((x,y),X)for x,y in d for X in[(x+1,y),(x,y+1),(x-1,y),(x,y-1)]if d[(x,y)]==v]
def f(b):
q=[({(x,y):v for x,r in E(b)for y,v in E(r)},0)]
for d,m in q:
t=[]
if m:
for T,u in W(d,1):
if(d.get(u,-1)in[0,2])>(T in t):d[u]=1;t+=u,
q+=(d,0),;continue
for T,u in W(d,2):
if d.get(u,-1)<0:return 1
q+=({**d,T:0,u:2},1),
def to_board(s):
return [['.FO'.index(j)for j in i]for i in filter(None, s.split('\n'))]
s = """
O
"""
s1 = """
....
.O..
....
"""
s2 = """
FFFFF
.....
..O..
.....
"""
s3 = """
FFFF
FFFO
FFFF
"""
s4 = """
.F....
......
......
.F....
..O...
.FF...
.F....
..FF..
"""
s5 = """
...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.
"""
s6 = """
FFF
FOF
FFF
"""
s7 = """
F.F
.O.
F.F
"""
s8 = """
....F
.....
..O..
.....
F....
"""
s9 = """
.F....F.
........
........
F..O....
........
.....F..
"""
s10 = """
...F...F
F......F
........
.F......
....O...
...F....
........
.F....F.
"""
s11 ="""
F..F
.O..
FF..
"""
print(f(to_board(s)))
print(f(to_board(s1)))
print(f(to_board(s2)))
print(f(to_board(s3)))
print(f(to_board(s4)))
print(f(to_board(s5)))
print(f(to_board(s6)))
print(f(to_board(s7)))
print(f(to_board(s8)))
print(f(to_board(s9)))
print(f(to_board(s10)))
print(f(to_board(s11)))
RT1lbnVtZXJhdGUKVz1sYW1iZGEgZCx2OlsoKHgseSksWClmb3IgeCx5IGluIGQgZm9yIFggaW5bKHgrMSx5KSwoeCx5KzEpLCh4LTEseSksKHgseS0xKV1pZiBkWyh4LHkpXT09dl0KZGVmIGYoYik6CiBxPVsoeyh4LHkpOnYgZm9yIHgsciBpbiBFKGIpZm9yIHksdiBpbiBFKHIpfSwwKV0KIGZvciBkLG0gaW4gcToKICB0PVtdCiAgaWYgbToKICAgZm9yIFQsdSBpbiBXKGQsMSk6CiAgICBpZihkLmdldCh1LC0xKWluWzAsMl0pPihUIGluIHQpOmRbdV09MTt0Kz11LAogICBxKz0oZCwwKSw7Y29udGludWUKICBmb3IgVCx1IGluIFcoZCwyKToKICAgaWYgZC5nZXQodSwtMSk8MDpyZXR1cm4gMQogICBxKz0oeyoqZCxUOjAsdToyfSwxKSwKICAgCmRlZiB0b19ib2FyZChzKToKCXJldHVybiBbWycuRk8nLmluZGV4KGopZm9yIGogaW4gaV1mb3IgaSBpbiBmaWx0ZXIoTm9uZSwgcy5zcGxpdCgnXG4nKSldCgpzID0gIiIiCk8KIiIiCnMxID0gIiIiCi4uLi4KLk8uLgouLi4uCiIiIgpzMiA9ICIiIgpGRkZGRgouLi4uLgouLk8uLgouLi4uLgoiIiIKczMgPSAiIiIKRkZGRgpGRkZPCkZGRkYKIiIiCnM0ID0gIiIiCi5GLi4uLgouLi4uLi4KLi4uLi4uCi5GLi4uLgouLk8uLi4KLkZGLi4uCi5GLi4uLgouLkZGLi4KIiIiCnM1ID0gIiIiCi4uLkYuLi5GCkYuLi4uLi4uCi4uLi4uLi4uCi5GLi4uLi4uCi4uLi5PLi4uCi4uLkYuLi4uCi4uLi4uLi4uCi5GLi4uLkYuCiIiIgpzNiA9ICIiIgpGRkYKRk9GCkZGRgoiIiIKczcgPSAiIiIKRi5GCi5PLgpGLkYKIiIiCnM4ID0gIiIiCi4uLi5GCi4uLi4uCi4uTy4uCi4uLi4uCkYuLi4uCiIiIgpzOSA9ICIiIgouRi4uLi5GLgouLi4uLi4uLgouLi4uLi4uLgpGLi5PLi4uLgouLi4uLi4uLgouLi4uLkYuLgoiIiIKczEwID0gIiIiCi4uLkYuLi5GCkYuLi4uLi5GCi4uLi4uLi4uCi5GLi4uLi4uCi4uLi5PLi4uCi4uLkYuLi4uCi4uLi4uLi4uCi5GLi4uLkYuCiIiIgpzMTEgPSIiIgpGLi5GCi5PLi4KRkYuLgoiIiIKCnByaW50KGYodG9fYm9hcmQocykpKQpwcmludChmKHRvX2JvYXJkKHMxKSkpCnByaW50KGYodG9fYm9hcmQoczIpKSkKcHJpbnQoZih0b19ib2FyZChzMykpKQpwcmludChmKHRvX2JvYXJkKHM0KSkpCnByaW50KGYodG9fYm9hcmQoczUpKSkKcHJpbnQoZih0b19ib2FyZChzNikpKQpwcmludChmKHRvX2JvYXJkKHM3KSkpCnByaW50KGYodG9fYm9hcmQoczgpKSkKcHJpbnQoZih0b19ib2FyZChzOSkpKQpwcmludChmKHRvX2JvYXJkKHMxMCkpKQpwcmludChmKHRvX2JvYXJkKHMxMSkpKQo=