DFS

DFS

Posted by 동식이 블로그 on March 26, 2019

dfs

최소 합
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
di = [0, 1]
dj = [1, 0]

def dfs(x,y,n):
    if x == n-1 and y ==n-1:
        a.append(visited[x][y])
    for i in range(2):
        dy,dx = y+di[i],x+dj[i]
        # if dy<0 or dx<0 or dx>=n or dy>=n:
        #     continue
        if 0 <= dy and dy < n and 0 <= dx and dx < n:
            if visited[dy][dx] == 0:
                visited[dy][dx] = visited[y][x] + arr[dy][dx]
                dfs(dx,dy,n)
                visited[dy][dx] = 0


T = int(input())

for tc in range(T):
    n = int(input())
    arr = []
    for i in range(n):
        arr.append(list(map(int, input().split())))
    visited = [[0]*n for i in range(n)]
    a = []
    visited[0][0] = arr[0][0]
    dfs(0,0,n)
    print("#{} {}".format(tc+1, min(a)))

순열

n개의 일
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def f(n, k, s):
    global minV
    if(n == k): # 모든 짝이 결정되면
        if(s < minV):
            minV = s
    elif(s >= minV): # 백트래킹
        return
    else:
        for i in range(k):
            if(u[i] == 0): # i번 일을 맡을 사람이 아직 없으면
                u[i] = 1 # i번일이 배정되었음을 기록
                f(n+1, k, s+m[n][i]) # n번 사람이 i번일을 하는데 걸리는 시간을 추가, n+1사람의 일을 배정하러 이동
                u[i] = 0 # i번일을 다른 사람에게 배정할 수 있도록 풀어줌


T = int(input())
for tc in range(T):
    k =  int(input())
    m = [list(map(int, input().split())) for i in range(k)]
    u = [0]*k # 배정된 일은 1로 표시
    minV = 10000000
    f(0, k, 0)
    print(minV)
전기카트
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def find():
    minV = 100000  # 최소값 초기화
    lst = [i for i in range(1, N)]  # 구역은 1에서 N-1번
    p = list(itertools.permutations(lst))  # 순열 생성 후 리스트에 저장
    for i in range(len(p)):  # 순열 개수 만큼 반복
        s = e[0][p[i][0]]  # 사무실-첫 구역간 소비량
        for j in range(1, N - 1):  # 구역간 소비량, N-1구역은 N-2인덱스에 들어있음
            s += e[p[i][j - 1]][p[i][j]]
        s += e[p[i][N - 2]][0]  # 마지막 구역-사무실
        if s < minV:
            minV = s
    return minV


sys.stdin = open('input.txt', 'r')
T = int(input())

for tc in range(1, T + 1):
    N = int(input())
    e = [list(map(int, input().split())) for i in range(N)]  # 사무실 0번, 마지막 구역 N-1번
    print('#{} {}'.format(tc, find()))