f=lambda M,t=1:max(f(M[1:]),f(zip(*M)[::-1],t+1))if`t/3`in`M`else`M`.count(`t`)
F = f
def f(M, t = 1, D={}):
k = tuple(M) + (t,)
if k not in D:
D[k] = F(M,t)
return D[k]
print f([(1, 1, 1, 0, 1, 1, 0, 0, 0), (1, 1, 0, 1, 1, 1, 1, 0, 0), (0, 0, 1, 1, 1, 1, 1, 1, 0), (0, 1, 1, 1, 1, 1, 1, 1, 1), (0, 0, 1, 1, 1, 1, 1, 1, 0), (0, 0, 0, 1, 1, 1, 1, 0, 0), (0, 0, 0, 0, 1, 1, 0, 0, 0)])
print f([(0, 0, 0, 1, 1, 0, 0, 0, 0), (1, 1, 0, 1, 1, 0, 0, 1, 0), (1, 1, 0, 1, 1, 1, 1, 1, 0), (1, 1, 0, 0, 1, 1, 1, 0, 0), (0, 1, 0, 0, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 0, 1, 1, 1, 0)])
Zj1sYW1iZGEgTSx0PTE6bWF4KGYoTVsxOl0pLGYoemlwKCpNKVs6Oi0xXSx0KzEpKWlmYHQvM2BpbmBNYGVsc2VgTWAuY291bnQoYHRgKQoKRiA9IGYKZGVmIGYoTSwgdCA9IDEsIEQ9e30pOgoJayA9IHR1cGxlKE0pICsgKHQsKQoJaWYgayBub3QgaW4gRDoKCQlEW2tdID0gRihNLHQpCglyZXR1cm4gRFtrXQoKcHJpbnQgZihbKDEsIDEsIDEsIDAsIDEsIDEsIDAsIDAsIDApLCAoMSwgMSwgMCwgMSwgMSwgMSwgMSwgMCwgMCksICgwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwKSwgKDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpLCAoMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCksICgwLCAwLCAwLCAxLCAxLCAxLCAxLCAwLCAwKSwgKDAsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDApXSkKcHJpbnQgZihbKDAsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDApLCAoMSwgMSwgMCwgMSwgMSwgMCwgMCwgMSwgMCksICgxLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAwKSwgKDEsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDApLCAoMCwgMSwgMCwgMCwgMSwgMSwgMSwgMSwgMSksICgxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSwgKDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDApXSk=