호프 2021. 7. 27. 11:49

https://www.acmicpc.net/problem/2026

 

2026번: 소풍

만약 K명의 친구 관계인 학생들이 존재하지 않는다면 -1을 출력한다. 그 외의 경우에는, K개의 줄에 학생들의 번호를 증가하는 순서로 한 줄에 한 개씩 출력한다. 여러 경우가 존재한다면 첫 번째

www.acmicpc.net

백트래킹 문제가 항상 어렵다... 재귀 싫어....

일단 재귀를 사용할 때는 먼저 탈출조건을 적은 후에 차근차근 생각하면 될 것 같다.

1. 먼저 조건을 체크하고, 조건에 맞으면 ans에 추가한다.

2. ans의 길이가 K가 되면 끝낸다.

3. dfs에서 탈출했을 때 pop해야한다.

import sys
input = sys.stdin.readline

K, N, F = map(int, input().split())
friends = [[0]*(N+1)  for _ in range(N+1)]

for _ in range(F):
    a, b = map(int, input().split())
    friends[a][b] = friends[b][a] = 1
    
ans = []
def dfs(v):
    if (len(ans)==K):
        for i in ans:
            print(i)
        sys.exit(0)
    
    for i in range(v+1, N+1):
        if (friends[v][i]==1):
            flag = True
            for j in ans:
                if (friends[i][j]!=1):
                    flag = False
                    break
            if (flag==True):
                ans.append(i)
                dfs(i)
    ans.pop()

    return
for i in range(1,N+1):
    ans.append(i)
    dfs(i)
    #ans.pop()
print(-1)

dfs안에서 pop을 해주기 때문에 호출하는 부분에서는 pop을 할 필요가 없다.