BOJ 1780用紙数


質問する


BOJ 1780用紙数
シルバーII|白駿1780|Python 3 Python池

アルゴリズム#アルゴリズム#


BOJ 2630色紙を作る題によく似ています.(制作BOJ 260カラーペーパー-解答)カラーペーパー作成は4等分ですが、この問題は9等分です.
  • 紙を9つの正方形のグループに分けた後、各グループが同じ値であれば、紙は利用可能な紙であり、その値に基づいて個数を記録する.
  • 紙の大きさが1 x 1になったら、これ以上カットできないので、紙の値に基づいて個数を記録します.
  • Pythonのリストスクライブを利用して,2次元配列を9つの正方形グループに分けて再帰関数を呼び出す.
    check([row[:c//3] for row in part[:c//3]], c//3)
    check([row[:c//3] for row in part[c//3:c//3*2]], c//3)
    check([row[:c//3] for row in part[c//3*2:]], c//3)
    check([row[c//3:c//3*2] for row in part[:c//3]], c//3)
    check([row[c//3:c//3*2] for row in part[c//3:c//3*2]], c//3)
    check([row[c//3:c//3*2] for row in part[c//3*2:]], c//3)
    check([row[c//3*2:] for row in part[:c//3]], c//3)
    check([row[c//3*2:] for row in part[c//3:c//3*2]], c//3)
    check([row[c//3*2:] for row in part[c//3*2:]], c//3)
    2 D配列の場合は、上記のfor文を使用して行と列をそれぞれスムーズに処理します.

    コード#コード#

    import sys
    
    input = sys.stdin.readline
    
    mone = 0 # -1 그룹 개수
    zero = 0 #  0 그룹 개수
    pone = 0 # +1 그룹 개수
    
    # 해당 그룹의 특정 수의 개수를 카운트하는 함수
    def count(part, c, x):
        count = 0
        for i in range(c):
            for j in range(c):
                if part[i][j] == x:
                    count += 1
    
        return count
    
    
    def check(part, c):
        global pone, zero, mone
        # 만약 블록이 1x1이라면 값에 따라 카운트 증가
        if c == 1:
            if part[0][0] == 1:
                pone += 1
            elif part[0][0] == 0:
                zero += 1
            else:
                mone += 1
            return
    	
        # 그 그룹의 칸이 전부 -1이라면
        if count(part, c, -1) == c * c:
            mone += 1
            return
        # 전부 0이라면
        elif count(part, c, 0) == c * c:
            zero += 1
            return
        # 전부 1이라면
        elif count(part, c, 1) == c * c:
            pone += 1
        
        # 다른 값이 섞여 있다면 9개의 정사각형 그룹으로 분할해서 체크하기
        else:
            check([row[:c//3] for row in part[:c//3]], c//3)
            check([row[:c//3] for row in part[c//3:c//3*2]], c//3)
            check([row[:c//3] for row in part[c//3*2:]], c//3)
            check([row[c//3:c//3*2] for row in part[:c//3]], c//3)
            check([row[c//3:c//3*2] for row in part[c//3:c//3*2]], c//3)
            check([row[c//3:c//3*2] for row in part[c//3*2:]], c//3)
            check([row[c//3*2:] for row in part[:c//3]], c//3)
            check([row[c//3*2:] for row in part[c//3:c//3*2]], c//3)
            check([row[c//3*2:] for row in part[c//3*2:]], c//3)
    
    
    N = int(input())
    p = [list(map(int, input().split())) for _ in range(N)]
    
    check(p, N)
    
    # 각 값으로 이루어진 그룹의 개수 출력
    print(mone)
    print(zero)
    print(pone)

    結果


    Python 3をコミットするとタイムアウトになります.Pypy 3でコミットする必要があります.