백준
백준17825: 주사위 윷놀이
E재HO
2022. 5. 10. 21:50
주사위 윷놀이 성공
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 | 512 MB | 10054 | 4112 | 2490 | 37.359% |
문제
주사위 윷놀이는 다음과 같은 게임판에서 하는 게임이다.

- 처음에는 시작 칸에 말 4개가 있다.
- 말은 게임판에 그려진 화살표의 방향대로만 이동할 수 있다. 말이 파란색 칸에서 이동을 시작하면 파란색 화살표를 타야 하고, 이동하는 도중이거나 파란색이 아닌 칸에서 이동을 시작하면 빨간색 화살표를 타야 한다. 말이 도착 칸으로 이동하면 주사위에 나온 수와 관계 없이 이동을 마친다.
- 게임은 10개의 턴으로 이루어진다. 매 턴마다 1부터 5까지 한 면에 하나씩 적혀있는 5면체 주사위를 굴리고, 도착 칸에 있지 않은 말을 하나 골라 주사위에 나온 수만큼 이동시킨다.
- 말이 이동을 마치는 칸에 다른 말이 있으면 그 말은 고를 수 없다. 단, 이동을 마치는 칸이 도착 칸이면 고를 수 있다.
- 말이 이동을 마칠 때마다 칸에 적혀있는 수가 점수에 추가된다.
주사위에서 나올 수 10개를 미리 알고 있을 때, 얻을 수 있는 점수의 최댓값을 구해보자.
입력
첫째 줄에 주사위에서 나올 수 10개가 순서대로 주어진다.
출력
얻을 수 있는 점수의 최댓값을 출력한다.
예제 입력 1 복사
1 2 3 4 1 2 3 4 1 2
예제 출력 1 복사
190
예제 입력 2 복사
1 1 1 1 1 1 1 1 1 1
예제 출력 2 복사
133
예제 입력 3 복사
5 1 2 3 4 5 5 3 2 4
예제 출력 3 복사
214
예제 입력 4 복사
5 5 5 5 5 5 5 5 5 5
예제 출력 4 복사
130
알고리즘 분류
문제 - 1 페이지
www.acmicpc.net
#include<iostream>
#include<algorithm>
using namespace std;
int order[10];
int mal[4];
int map[35];
int turn[35];
bool check[35];
int score[35];
int answer;
void dfs(int cnt, int sum) {
if (cnt == 10) {
answer = max(answer, sum);
return;
}
for (int i = 0; i < 4; i++) {
int prev = mal[i];
int now = prev;
int move = order[cnt];
if (turn[now] > 0) {
now = turn[now];
move -= 1;
}
while (move--) {
now = map[now];
}
if (now != 21 && check[now] == true) continue;
check[prev] = false;
check[now] = true;
mal[i] = now;
dfs(cnt + 1, sum + score[now]);
mal[i] = prev;
check[prev] = true;
check[now] = false;
}
}
int main() {
for (int i = 0; i < 21; i++) map[i] = i + 1;//맵의 u자 곡선
for (int i = 22; i < 27; i++) map[i] = i + 1;//I선
map[21] = 21;
map[28] = 29; map[29] = 30; map[30] = 25;
map[31] = 32; map[32] = 25; map[27] = 20;
turn[5] = 22;//좌에서 꺽임
turn[15] = 28;//우에서 꺽임
turn[10] = 31;//U의 맨밑점에서 위로 꺽임
turn[25] = 26;//U의 중간지점에서 위로 꺽임
for (int i = 0; i < 21; i++) score[i] = i * 2;
score[22] = 13; score[23] = 16; score[24] = 19;//---25
score[28] = 28; score[29] = 27; score[30] = 26;//25---
score[31] = 22; score[32] = 24;//|선 위
score[26] = 30; score[27] = 35;//|선 아래
score[25] = 25;
// 주사위 입력 받기.
for (int i = 0; i < 10; i++) cin >> order[i];
dfs(0, 0);
cout << answer << "\n";
return 0;
}
골드2부터 꽤 어려운것 같다.. 힘내서 이 구간을 뚫어보자!