-
[2116] 주사위 쌓기BOJ 2022. 1. 9. 12:55
https://www.acmicpc.net/problem/2116
2116번: 주사위 쌓기
첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는
www.acmicpc.net
<문제>
맨 아래가 정해지면 그 위 n-1개의 주사위의 순서는 필연이므로 dfs 하듯이 구현해줄 수 있다.
간단하게 생각해서, 한쪽면에 올 숫자는, 위아래와 맞닿는 면 2개를 제외한 4개중의 최대값을 선택한다.
주사위의 맞은편의 연결된 인덱스(?)가 조금 헷갈리는데,
한번에 base[]={5, 3, 4, 1, 2, 0};처럼 상수마냥 정의해두면 그나마 조금 덜 헷갈린다.
이제는 맨 아래를 놓는 경우의 수를 찾으면 되는데, 맨 아래 주사위 역시 윗면이 정해지면, 보여지는 면은
(6-2)개중의 최대값으로 설정하면, 6개의 경우의 수 밖에 남지 않는다.
<소스코드>
1234567891011121314151617181920212223242526272829#include <bits/stdc++.h>using namespace std;int n, ans, a[10001][6], base[6] = {5, 3, 4, 1, 2, 0};int f(int d, int up) {if (d == n) return 0;int i;for (i = 0; i < 6; i++)if (up == a[d][i]) break;int idx = base[i];int nxtUp = a[d][idx];int sc = 6;if (nxtUp + up == 11)sc = 4;else if (nxtUp == 6 || up == 6)sc = 5;return f(d + 1, nxtUp) + sc;}int main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cin >> n;int i, j;for (i = 0; i < n; i++)for (j = 0; j < 6; j++) cin >> a[i][j];for (i = 0; i < 6; i++) ans = max(f(0, a[0][i]), ans);cout << ans;return 0;}cs 'BOJ' 카테고리의 다른 글
[2805] 나무 자르기 (0) 2022.01.12 [17141] 연구소 2 (0) 2022.01.09 [21740] 도도의 수학놀이 (0) 2022.01.08 [21608] 상어 초등학교 (0) 2022.01.05 [16930] 달리기 (0) 2022.01.04