17825-주사위윷놀이
인접노드 정보를 갖는 graph 를 만들자
빨간색흐름을 타는 인접노드
방향이 바뀌는 파란색 흐름만 타는 인접노드
노드마다 점수를 갖는 점수 정보 리스트 만들기
네 마리의 말마다 조건에 맞다면 모두를 각각 DFS 로 재귀를 보내주자
dice = list(map(int, input().split()))
chess = [0 for _ in range(4)]
# 빨간 노드
red = [0 for _ in range(33)]
for i in range(33):
# 들어가면 다음칸으로 가도록
red[i] = i + 1
# 도착칸에 들어오면 계속 그 칸으로 가도록
red[21] = 21
red[22], red[23], red[24] = 23, 24, 30
red[25], red[26] = 26, 30
red[27], red[28], red[29] = 28, 29, 30
red[30], red[31], red[32] = 31, 32, 20
# 파란 노드
blue = [0 for _ in range(16)]
blue[5], blue[10], blue[15] = 22, 25, 27
# 해당칸의 점수
score = [0 for _ in range(33)]
for i in range(1, 21):
score[i] = i * 2
score[22], score[23], score[24] = 13, 16, 19
score[25], score[26] = 22, 24
score[27], score[28], score[29] = 28, 27, 26
score[30], score[31], score[32] = 25, 30, 35
def dfs(dice_index, total):
global max_total
if dice_index == 10:
max_total = max(total, max_total)
return
# 4 마리 말에 대하여 반복문 # 어차피 4마리라는걸 생각하자, 그리고 중복되는걸 생각하자
for i in range(4):
# 현재 재귀에서 필요한 " 값 " 을 불러서 변수 지정하자
nx, x, move = chess[i], chess[i], dice[dice_index]
# 이동하려는 녀석이 파란곳에 있다면
if nx == 5 or nx == 10 or nx == 15:
nx = blue[nx]
# 노드를 미리 옮겨줘서 흐름을 타게 만들어야 한다.
# 노드를 미리 옮겼기 때문에 주사위 가는 수 1 미리 줄여주자
move -= 1
# move 번 노드를 따라 가면된다. 중간에 21이 나온다면 스스로인 인접노드로 계속 재정의될뿐
for _ in range(move):
nx = red[nx]
if nx in chess and nx != 21:
continue
chess[i] = nx
dfs(dice_index + 1, total + score[nx])
chess[i] = x
max_total = 0
dfs(0, 0)
print(max_total)
Last updated