白準1992四叉木

14674 ワード

四叉木


問題は白駿で確認できます.

✔方法

  • 分期征服,再帰路解
  • は4つの部分に分かれており、再帰処理
  • は、
  • を直ちに圧縮することができる.
  • が圧縮できない場合、
  • が戻る.

    ✔コード

    
    import sys
    
    def solution(arr):
        global answer
        # print(answer)
        answer.append('(')
    
        size = len(arr[0])
        part = [[],[],[],[]]
    
        # 재귀 탈출 조건. 가로/세로 사이즈가 1이라면 더이상 압축이 되지 않음
        if size == 1:
            answer.append(arr[0][0])
        # 압축이 불가능한 상태라면
        else:
            for i in range(size):
                if i < size // 2 :
                    #왼쪽위
                    part[0].append(arr[i][0:size//2])
                    #오른쪽위
                    part[1].append(arr[i][size//2:])
                else:
                    #왼쪽아래
                    part[2].append(arr[i][0:size//2])
                    #오른쪽아래
                    part[3].append(arr[i][size//2:])
    
            # for p in part:
            #     for line in p:
            #         print(line)
            #     print("="*10)
    
            cnt = [0] * 4 # 왼쪽위,오른쪽위,왼쪽아래,오른쪽아래
            for i in range( size//2 ):
                cnt[0] += part[0][i].count(1)
                cnt[1] += part[1][i].count(1)
                cnt[2] += part[2][i].count(1)
                cnt[3] += part[3][i].count(1)
    
            # print(cnt)
    
            # 원소를 확인
            for i in range( 4 ):
                if cnt[i] == 0:
                    answer.append("0")
                elif cnt[i] == (size//2)**2:
                    answer.append("1")
                else:
                    solution(part[i])
    
        answer.append(')')    
    
    
    if __name__ == "__main__":
        answer = []
        N = int(input())
        
        arr = []
        for _ in range(N):
            line = list(map(int, sys.stdin.readline().rstrip()))
            arr.append(line)
    
        # for line in arr:
        #     print(line)
    
        # 모든 원소를 확인
        all_cnt = 0
        size = len(arr[0])
        for i in range(size):
            all_cnt += arr[i].count(1)
    
        if all_cnt == 0:
            answer.append("0")
        elif all_cnt == size ** 2:
            answer.append("1")
        # 한번에 압축이 되지 않는다면 재귀적으로 처리
        else :
            solution(arr)
        
        print("".join(answer))
    

    チップ


    まず
  • の再回帰条件を定義することは、設計の迅速な再回帰に役立つようである.