BOJ 17825: 주사위 윷놀이 https://www.acmicpc.net/problem/17825
말 4개
가 있다.파란색 칸
에서 이동을 시작하면 파란색 화살표
를 타야 하고, 이동하는 도중이거나 파란색이 아닌 칸
에서 이동을 시작하면 빨간색 화살표
를 타야 한다.도착 칸
으로 이동하면 주사위에 나온 수와 관계 없이 이동을 마친다.10개의 턴
으로 이루어진다.1부터 5
까지 한 면에 하나씩 적혀있는 5면체 주사위를 굴린다.도착 칸에 있지 않은 말
을 하나 골라 주사위에 나온 수
만큼 이동
시킨다.이동을 마치는 칸에 다른 말이 있으면
그 말은 고를 수 없다.graph
score
백트래킹
을 이용해 어떤 말을 이동시킬 지 조합한 경우를 사용해 말을 이동시킨다.graph = [[1], [2], [3], [4], [5],
[6, 21], [7], [8], [9], [10],
[11, 25], [12], [13], [14], [15],
[16, 27], [17], [18], [19], [20],
[32], [22], [23], [24], [30],
[26], [24], [28], [29], [24],
[31], [20], [32]]
score = [0, 2, 4, 6, 8,
10, 12, 14, 16, 18,
20, 22, 24, 26, 28,
30, 32, 34, 36, 38,
40, 13, 16, 19, 25,
22, 24, 28, 27, 26,
30, 35, 0]
dice = list(map(int, input().split()))
answer = 0
def backtracking(depth, result, horses):
global answer
if depth == 10:
answer = max(answer, result)
return
for i in range(4):
# 현재 말 위치
x = horses[i]
# 현재 말 위치가 2갈래 갈 수 있는 위치(10, 20, 30)인지 체크
if len(graph[x]) == 2:
# 파란 길 한 칸 진입
x = graph[x][1]
else:
# 빨간 길 한 칸 진입
x = graph[x][0]
# 나온 주사위 값 만큼 말 이동(위에서 1칸 이동했기 때문에 1 덜 이동함)
for _ in range(1, dice[depth]):
x = graph[x][0]
# 목적지에 도착했거나 or (아직 목적지가 아니고 and 거기에 말이 없다면)
if x == 32 or (x < 32 and x not in horses):
before = horses[i] # 이전 말의 위치
horses[i] = x # 현재 말 위치 갱신
backtracking(depth + 1, result + score[x], horses)
horses[i] = before
backtracking(0, 0, [0, 0, 0, 0])
print(answer)