M=[(1,0),(-1,0),(0,-1),(0,1)]
E=enumerate
def G(d):
q=[*d]
while q:
Q=[q.pop(0)];s=[*Q]
for x,y in Q:
for X,Y in M:
if(T:=(x+X,y+Y))in q and d[T]==d[(x,y)]:s+=T,;Q+=T,;q=[*{*q}-{T}]
yield s
def f(b):
a,u=G({(x,y):v for x,r in E(b)for y,v in E(r)});q=[(u,*i)for i in M]
for b,x,y in q:
if[]==b:return 1
B,F=[],1
for X,Y in b:
if(T:=(x+X,y+Y))in a:F=0;break
B+=(T in u)*[T]
q+=F*[(B,x,y)]
s1 = """
BBB
BAA
BBB
BA
A
B
AB
AB
AAA
BBB
AAAAB
ABBBB
ABBA
ABBA
AAAA
AAAAAABBBBBBBBB
AABBBBBBBBBBBBB
AAAAAAAAAABBBBB
AABBBBBBBBBBBBB
AAAAAAAAAAAAAAB
AAAAAAAAAAAA
ABABABABABAB
BBBBBBBBBBBB
BAAAAABB
BBAAABBB
BBBABBBB
BBBABBBB
BBBABBBB
BBBBBBBB
BBBBBBBB
AAA
BAA
AAA
"""
s2 = """
BBBB
BAAB
BABB
BBBB
BAAB
AABB
BBBBBBB
BBBBBAB
AAAAAAB
BBBBBBB
BAAA
BABA
BBBA
AABA
AAAA
AAAAAAA
ABBBBBA
AAAAABA
BBBBBBA
BAAAAABB
BBAAABBB
BBBABBBB
BBBABBBB
BBBAABBB
BBBBBBBB
BBBBBBBB
AAA
ABA
BBA
ABA
AAA
"""
def to_board(s):
return [[*i]for i in filter(None, s.split('\n'))]
for a, b in [(s1, 1), (s2, None)]:
for j in a.split('\n\n'):
assert f(to_board(j))==b
print('tests passed')
TT1bKDEsMCksKC0xLDApLCgwLC0xKSwoMCwxKV0KRT1lbnVtZXJhdGUKZGVmIEcoZCk6CiBxPVsqZF0KIHdoaWxlIHE6CiAgUT1bcS5wb3AoMCldO3M9WypRXQogIGZvciB4LHkgaW4gUToKICAgZm9yIFgsWSBpbiBNOgogICAgaWYoVDo9KHgrWCx5K1kpKWluIHEgYW5kIGRbVF09PWRbKHgseSldOnMrPVQsO1ErPVQsO3E9Wyp7KnF9LXtUfV0KICB5aWVsZCBzCmRlZiBmKGIpOgogYSx1PUcoeyh4LHkpOnYgZm9yIHgsciBpbiBFKGIpZm9yIHksdiBpbiBFKHIpfSk7cT1bKHUsKmkpZm9yIGkgaW4gTV0KIGZvciBiLHgseSBpbiBxOgogIGlmW109PWI6cmV0dXJuIDEKICBCLEY9W10sMQogIGZvciBYLFkgaW4gYjoKICAgaWYoVDo9KHgrWCx5K1kpKWluIGE6Rj0wO2JyZWFrCiAgIEIrPShUIGluIHUpKltUXQogIHErPUYqWyhCLHgseSldCiAgCnMxID0gIiIiCkJCQgpCQUEKQkJCCgpCQQoKQQpCCgpBQgpBQgoKQUFBCkJCQgoKQUFBQUIKQUJCQkIKCkFCQkEKQUJCQQpBQUFBCgpBQUFBQUFCQkJCQkJCQkIKQUFCQkJCQkJCQkJCQkJCCkFBQUFBQUFBQUFCQkJCQgpBQUJCQkJCQkJCQkJCQkIKQUFBQUFBQUFBQUFBQUFCCgpBQUFBQUFBQUFBQUEKQUJBQkFCQUJBQkFCCkJCQkJCQkJCQkJCQgoKQkFBQUFBQkIKQkJBQUFCQkIKQkJCQUJCQkIKQkJCQUJCQkIKQkJCQUJCQkIKQkJCQkJCQkIKQkJCQkJCQkIKCkFBQQpCQUEKQUFBCiIiIgpzMiA9ICIiIgpCQkJCCkJBQUIKQkFCQgoKQkJCQgpCQUFCCkFBQkIKCkJCQkJCQkIKQkJCQkJBQgpBQUFBQUFCCkJCQkJCQkIKCkJBQUEKQkFCQQpCQkJBCkFBQkEKQUFBQQoKQUFBQUFBQQpBQkJCQkJBCkFBQUFBQkEKQkJCQkJCQQoKQkFBQUFBQkIKQkJBQUFCQkIKQkJCQUJCQkIKQkJCQUJCQkIKQkJCQUFCQkIKQkJCQkJCQkIKQkJCQkJCQkIKCkFBQQpBQkEKQkJBCkFCQQpBQUEKIiIiCgpkZWYgdG9fYm9hcmQocyk6CglyZXR1cm4gW1sqaV1mb3IgaSBpbiBmaWx0ZXIoTm9uZSwgcy5zcGxpdCgnXG4nKSldCgoKZm9yIGEsIGIgaW4gWyhzMSwgMSksIChzMiwgTm9uZSldOgoJZm9yIGogaW4gYS5zcGxpdCgnXG5cbicpOgoJCWFzc2VydCBmKHRvX2JvYXJkKGopKT09YgoKcHJpbnQoJ3Rlc3RzIHBhc3NlZCcp