[블 루 브리지 컵] 7 단 코드 python 해법

11035 단어 블 루 브리지 컵
[문제 설명] 파랑 이 는 7 단 디지털 관 으로 특수 한 문 자 를 표시 해 야 한다.
위의 그림 은 7 단 디지털 관 의 그림 을 보 여 주 었 다. 디지털 관 에는 모두 7 단 이 빛 을 발 할 수 있 는 다이오드 가 있 는데 각각 a, b, c, d, e, f, g 로 표시 되 어 있다.파란색 은 일부 다이오드 (적어도 하나) 의 발광 을 선택 하여 문 자 를 표현 해 야 한다.문자 의 표현 을 디자인 할 때 모든 빛 나 는 다이오드 가 한 조각 으로 연결 되 어야 한다.예 를 들 어 b 발광, 다른 다이오드 가 발광 하지 않 으 면 한 문 자 를 표현 할 수 있다.예 를 들 어 c 발광, 기타 다이오드 가 발광 하지 않 으 면 한 문 자 를 표현 할 수 있다.이 방안 은 이전 줄 의 방안 과 비슷 해 보이 지만 다른 문 자 를 표시 하 는 데 사용 할 수 있다.예 를 들 어 a, b, c, d, e 발광, f, g 불 발광 은 한 문 자 를 표현 할 수 있다.예 를 들 어 b, f 가 빛 을 발 하고 다른 다이오드 가 빛 을 발 하지 않 으 면 한 가지 문 자 를 표현 할 수 없다. 빛 나 는 다이오드 가 한 조각 으로 연결 되 지 않 았 기 때문이다.블 루 는 7 단 디지털 튜브 로 몇 가지 다른 문 자 를 표현 할 수 있 습 니까?
결과: 80
import itertools

class UnionFindSet():
    def __init__(self,n):
        self.setSize = n  #     
        self.father = {
     i:-1 for i in range(7)}

    def find(self,x):
        root = x
        while self.father[root] != -1:  #    
            root = self.father[root]

        while (x != root): #    
            o = self.father[x]  # x    
            self.father[x] = root  # x             
            x = o  #    

        return root

    def merge(self, x, y):
        root_x = self.find(x)
        root_y = self.find(y)
        if root_x != root_y:
            self.father[root_x] = root_y  #  
            self.setSize -= 1
            
dic = {
     
    0: [1, 5], 1: [0, 2, 6], 2: [1, 3, 6], 3: [2, 4], 4: [3, 5, 6], 5: [0, 4, 6], 6: [1, 2, 4, 5]
}

ans, nums = 7, [x for x in range(7)]
for i in range(2,8):
    for j in (itertools.combinations(nums, i)):
        uf = UnionFindSet(len(j))
        for k in range(len(j)):
            for m in range(k + 1, len(j)):
                if j[m] in dic[j[k]]:
                    uf.merge(j[m], j[k])
        if uf.setSize == 1:
            ans += 1
print(ans)
                

좋은 웹페이지 즐겨찾기