import sys
Input = sys.stdin.readline
N = int(Input())
door1, door2 = map(int, Input().split())
M = int(Input())
pos = [int(Input()) for _ in range(M)]
cnt = 0 # index, door1, door2까지 '몇 번 문을 움직였는가'
path = [-1] * M # 각 index문 마다 얼마나 이동시켰는가?
ans = 213456789000 # 답(cnt의 최솟값)
def dfs(index, door1, door2):
#index : 이번에 열 문의 번째, door1,door2 : 지금 문이 위치한 곳
global cnt, ans
# 2. 기저조건 (끝낼 조건)
if ans < cnt: # 현재 최고기록보다 커지면 가망이 없으므로 그만
return
if index >= M: # index+1이 들어왔는데 그게 주어진 갯수를 넘으면 중지
ans = min(ans, cnt)
return
# 1. now -> next 구조 잡기
cnt += abs(door1 - pos[index])
path[index] = abs(door1 - pos[index])
dfs(index + 1, pos[index], door2) # door1으로 pos[index]를 여는 경우
# door1을 pos[index]로 옮겨서 진행하는 모든 방법을 진행
path[index] = -1
cnt -= abs(door1 - pos[index]) # 기록 복구
cnt += abs(door2 - pos[index])
path[index] = abs(door2 - pos[index])
dfs(index + 1, door1, pos[index]) # door2으로 pos[index]를 여는 경우
path[index] = -1
cnt -= abs(door2 - pos[index]) # 기록 복구
pass
dfs(0, door1, door2)
print(ans)
풀이
dfs내부에는 왼쪽문으로 여는 경우와 오른쪽문으로 여는 경우가 존재합니다.
path
를 통해 각 벽장마다 몇번 움직였는지 체크합니다.
처음에 dfs(0, door1, door2)
로 시작합니다.
dfs(1, pos[index], door2)
dfs(2, pos[index], door2)
dfs(3, pos[index], door2)
dfs(4, pos[index], door2)
dfs(4, door1, pos[index])
위와 같이 진행하면서 모든 노드를 탐색하는 방법입니다.
지금은 일부만 살펴보았지만 계속 진행한다면 조건에 맞는 모든 경우를 탐색합니다.