[SWEA][D3][#11803] 완전검색_전기카트

작성:    

업데이트:

카테고리:

태그: , ,

출처

학습용 포스트입니다. 본 포스트가 문제가 될 시 수정 또는 삭제하겠습니다.


문제

골프장 관리를 위해 전기 카트로 사무실에서 출발해 각 관리구역을 돌고 다시 사무실로 돌아와야 한다.

사무실에서 출발해 각 구역을 한 번씩만 방문하고 사무실로 돌아올 때의 최소 배터리 사용량을 구하시오.

각 구역을 이동할 때의 배터리 사용량은 표로 제공되며, 1번은 사무실을, 2번부터 N번은 관리구역 번호이다.

두 구역 사이도 갈 때와 올 때의 경사나 통행로가 다를 수 있으므로 배터리 소비량은 다를 수 있다.

N이 3인 경우 가능한 경로는 1-2-3-1, 1-3-2-1이며 각각의 배터리 소비량은 다음과 같이 계산할 수 있다.

e[1][2]+e[2][3]+e[3][1] = 18+55+18 = 91

e[1][3]+e[3][2]+e[2][1] = 34+7+48 = 89

그림 생략

이 경우 최소 소비량은 89가 된다.


입력

첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50

다음 줄부터 테스트 케이스의 별로 첫 줄에 N이 주어지고, 다음 줄부터 N개씩 N개의 줄에 걸쳐 100이하의 자연수가 주어진다. 3<=N<=10


출력

각 줄마다 “#T” (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.


예제

입력

3
3
0 18 34
48 0 55
18 7 0
4
0 83 65 97
82 0 78 6
19 19 0 82
6 34 94 0
5
0 9 26 85 42
14 0 84 31 27
58 88 0 16 46
83 61 94 0 17
40 71 24 38 0


출력

#1 89
#2 96
#3 139


My Sol

def combi(i, ssum):
    global stack
    if i == N-1:
        global minCost
        ssum += mat[stack[-1]][0]
        if minCost > ssum:
            minCost = ssum
        return

    for k in range(1, N):
        if visited[k]: continue
        visited[k] = 1
        stack.append(k)
        combi(i+1, ssum+mat[stack[i]][stack[i+1]])
        visited[k] = 0
        stack.pop()


T = int(input())
for tc in range(1, T+1):
    N = int(input())
    mat = [list(map(int, input().split())) for _ in range(N)]
    visited = [0]*N
    stack = [0]
    minCost = 10000
    combi(0, 0)

    print(f'#{tc} {minCost}')

완전 탐색을 이용해 조합의 모든 경우의 수를 하나하나 고려하여 최적해를 구하였다.


결과

PASS

댓글남기기