BOJ 1051号数字正方形

5767 ワード


質問する


N×Mサイズの長方形があります.1マスに1つの数字が書いてある.この長方形では、頂点上のすべての数字が等しい最大の正方形を検索するプログラムを作成します.この場合、正方形は行または列に平行でなければなりません.

入力


1行目はNとMです.NおよびMは50以下の自然数である.2行目からN行に数字を付ける.

しゅつりょく


1行目は正しい答えの正方形のサイズを出力します.
N,M = map(int,input().split())
rect = [list(map(int,input())) for _ in range(N)]

max_dist = 0
max_result = 0

for i in range(N):
    for j in range(M):
        V = rect[i][j]
        max_dist = 0
        for k in range(min(N, M)):
            # 정사각형 범위를 벗어나면 break
            dist = abs(j - k)
            # 가장 멀리 떨어져있는 점을 구하기 위해서 max_dist 갱신
            if V == rect[i][k]:
                max_dist = max(max_dist, dist)
                # 가장 큰 정사각형의 넓이를 구하기 위해서 max_result 갱신
                if i+max_dist<N and V == rect[i+max_dist][j] and V == rect[i+max_dist][k]:
                    size = (max_dist+1)**2
                    max_result = max(max_result,size)

print(max_result)
N,Mが与える範囲は小さく(N,M≦50),Brootforceで解くことができる.
問題では最大サイズの正方形が必要なので、最大に更新しながら最大を選択する場合の数です.
横のエッジで同じ数値を繰り返し検索すると、2つの数の間の距離をインデックスとして残りの頂点に直接近づくことができます.
その通りの角の数字も同じなら、幅を求めて最低価格より更新します.
注意すべき点は、1つの数字も正方形として扱われるので、距離が要求され、+1になります.