[伯俊]3085号-キャンディゲームPython


質問する
尚根は子供の頃、「Bomboni」ゲームが好きだった.
最初はN×砂糖をnサイズのところに入れる.キャンディの色が違うかもしれません.上根は隣接するキャンディの色の異なる格子を2つ選んだ.それから均一な四角い格子の中のキャンディを交換します.今では、すべての人が同じ色からなる最長の連続部分(行または列)を選択し、すべてのキャンディを食べてしまいます.
あなたがあなたにあげた砂糖が満たされたとき、プログラムを書いて、あなたが食べられる砂糖の最大個数を求めます.
入力
最初の行は、プレートのサイズNを与える.(3 ≤ N ≤ 50)
次のN行は、板紙に充填されたキャンディの色を与える.赤はC、青はP、緑はZ、黄色はYです.
隣接する2つのキャンディ色の異なる格子が存在する入力のみが与えられる.
しゅつりょく
1行目は、食べられるキャンディの最大個数を出力します.
入力例1
3
CCP
CCP
PPC
サンプル出力1
3
入力例2
4
PPPP
CYZY
CCPY
PPCC
サンプル出力2
4
入力例3
5
YCPZY
CYZZP
CCPPP
YCYZC
CPPZZ
サンプル出力3
4
に答える
# N^3 풀이
def check(a,start_row, end_row, start_col, end_col):
    n = len(a)
    ans = 1
    for i in range(start_row, end_row+1):
        cnt = 1
        for j in range(1,n):
            if a[i][j] == a[i][j-1]:
                cnt+=1
            else:
                cnt = 1
            if ans<cnt:
                ans = cnt
    for i in range(start_col, end_col+1):
        cnt =1
        for j in range(1,n):
            if a[j][i] == a[j-1][i]:
                cnt+=1
            else:
                cnt =1
            if ans<cnt:
                ans = cnt
    return ans

n = int(input())
a = [list(input()) for _ in range(n)]
ans = 0

# 상하좌우로 바꿀 수 있는데 왼쪽이랑 위로 바꾸는 방법은 이미 이전단계에서 비교함 
# 따라서 오른쪽, 아래쪽만 바꿔서 비교해나간다
for i in range(n):
    for j in range(n):
        # 열 바꾸기
        if j+1<n:
            a[i][j],a[i][j+1] = a[i][j+1],a[i][j]
            tmp = check(a,i,i,j,j+1)
            if ans< tmp:
                ans= tmp
            a[i][j],a[i][j+1] = a[i][j+1],a[i][j]
        # 행 바꾸기
        if i+1<n:
            a[i][j], a[i+1][j] = a[i+1][j],a[i][j]
            tmp = check(a,i,i+1,j,j)
            if ans<tmp:
                ans = tmp;
            a[i][j], a[i+1][j] = a[i+1][j],a[i][j]
print(ans)
整理する
右下
  • のみを変更して比較します.
  • の変更部分を含む列と行をチェックすれば、重複する部分を減らすことができます.