# -*- coding:utf-8 -*-

class SubMatrix:
    def maxSubMatrix(self, mat, n):
        # 初始化四个预处理矩阵
        right0 = [[0] * n for _ in range(n)]
        right1 = [[0] * n for _ in range(n)]
        down0  = [[0] * n for _ in range(n)]
        down1  = [[0] * n for _ in range(n)]

        # 计算right0和right1(从右往左)
        for i in range(n):
            right0[i][n-1] = 1 if mat[i][n-1] == 0 else 0
            right1[i][n-1] = 1 if mat[i][n-1] == 1 else 0

            for j in range(n - 2, -1, -1):
                if mat[i][j] == 0:
                    right0[i][j] = right0[i][j+1] + 1
                    right1[i][j] = 0
                else:
                    right0[i][j] = 0
                    right1[i][j] = right1[i][j+1] + 1

        # 计算down0和down1(从下往上)
        for j in range(n):
            down0[n-1][j] = 1 if mat[n-1][j] == 0 else 0
            down1[n-1][j] = 1 if mat[n-1][j] == 1 else 0

            for i in range(n - 2, -1, -1):
                if mat[i][j] == 0:
                    down0[i][j] = down0[i+1][j] + 1
                    down1[i][j] = 0
                else:
                    down0[i][j] = 0
                    down1[i][j] = down1[i+1][j] + 1

        # 从大到小检查可能的边长
        for k in range(n, 0, -1):
            for i in range(0, n - k + 1):
                for j in range(0, n - k + 1):
                    if (right0[i][j] >= k and right0[i + k -1][j] >= k and down0[i][j] >= k and down0[i][j + k -1] >= k) or \
                       (right1[i][j] >= k and right1[i + k -1][j] >= k and down1[i][j] >= k and down1[i][j + k -1] >= k):
                        return k
        return 1

def main():
    # 创建矩阵mat [[1,1,1],[1,0,1],[1,1,1]],3
    mat = [[1,1,1],[1,0,1],[1,1,1]]

    mat2 = [
        [1, 1, 1, 1],
        [1, 0, 0, 1],
        [1, 0, 0, 1],
        [1, 1, 1, 0]
    ]

    mat3 = [
        [0, 0, 0],
        [0, 1, 0],
        [0, 0, 0]
    ]

    n = 3

    # 创建SubMatrix类实例
    submatrix = SubMatrix()

    # 调用方法查找到最大子方阵的边长
    maxSubMatrixLength = submatrix.maxSubMatrix(mat,n)

    print(maxSubMatrixLength)

if __name__ == "__main__":
    main()