반응형
https://www.acmicpc.net/problem/17825
17825번: 주사위 윷놀이
첫째 줄에 주사위에서 나올 수 10개가 순서대로 주어진다.
www.acmicpc.net
[ 문제풀이 ]
1. 먼저 윷놀이 판을 배열로 만들어줍니다.
2. 말의 이동을 각각의 조건에 맞게 움직일 수 있도록 분기를 나누어줍니다.
3. visited 배열을 통해서 현재 말들의 위치를 기록해주고, 도착점에 다른 말이 있다면 다음 말로 넘어가도록 해줍니다.
4. 위 과정을 반복해줍니다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include<iostream> using namespace std; int arr[10]; int ans; int cur[4]; int visited[32]; int map[32] = { //게임판 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,13,16,19,22,24,28,27,26,25,30,35 }; int move(int cur, int dice) //게임판의 이동 경로 { for (int i = 0; i < dice; i++) { if (cur == 5 && i == 0) { cur = 21; } else if (cur == 10 && i == 0) { cur = 24; } else if (cur == 15 && i == 0) { cur = 26; } else if (cur == 23 || cur == 25) { cur = 29; } else if (cur == 31) { cur = 20; } else if (cur == 20) { cur = 32; } else { cur++; } if (cur > 31) { return 32; } } return cur; } void dfs(int level, int sum) { if (level == 10) { ans = max(ans, sum); return; } for (int i = 0; i < 4; i++) { if (cur[i] > 31) continue; int a = cur[i]; cur[i] = move(a, arr[level]); //도착점 if (visited[cur[i]] == 1) { //도착점에 말이 있다면 cur[i] = a; continue; } if (cur[i] <= 31) { //도착 칸에 도착했다면 sum += map[cur[i]]; visited[cur[i]] = 1; } visited[a] = 0; dfs(level + 1, sum); visited[a] = 1; if (cur[i] <= 31) { //도착 칸에 도착했다면 visited[cur[i]] = 0; sum -= map[cur[i]]; } cur[i] = a; } } int main() { for (int i = 0; i < 10; i++) { scanf("%d", &arr[i]); } dfs(0,0); printf("%d", ans); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 19236번 - 청소년 상어 (C++) (0) | 2022.09.29 |
---|---|
[ 백준 ] 20061번 - 모노미노도미노 2 (C++) (0) | 2022.09.28 |
[ 백준 ] 21611번 - 마법사 상어와 블리자드 (C++) (0) | 2022.09.26 |
[ 백준 ] 17822번 - 원판 돌리기 (C++) (0) | 2022.09.25 |
[ 백준 ] 20057번 - 마법사 상어와 토네이도 (C++) (0) | 2022.09.24 |