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)])