DY N DY
실력키우기 주사위 쌓기(C++) 본문
1147 : 주사위 쌓기
제한시간: 1000 ms 메모리제한: 32 MB
해결횟수: 489 회 시도횟수: 1358 회
천수는 여러 종류의 주사위를 가지고 쌓기 놀이를 하고 있다. 주사위의 모양은 모두 크기가 같은 정육면체이며 각 면에는 1부터 6까지의 숫자가 하나씩 적혀있다. 그러나 보통 주사위 처럼 마주 보는 면에 적혀진 숫자의 합이 반드시 7이 되는 것은 아니다.
주사위 쌓기 놀이는 아래에서부터 1번 주사위, 2번 주사위, 3번 주사위, ... 의 순서로 쌓는 것이다. 쌓을 때는 다음과 같은 규칙을 지켜야 한다: 서로 붙어 있는 두 개의 주사위에서 아래에 있는 주사위의 윗면에 적혀있는 숫자는 위에 있는 주사위의 아랫면에 적혀있는 숫자와 같아야 한다. 다시 말해서, 1번 주사위 윗면의 숫자는 2번 주사위 아랫면의 숫자와 같고, 2번 주사위 윗면의 숫자는 3번 주사위 아랫면의 숫자와 같아야 한다. 단, 1번 주사위는 마음대로 놓을 수 있다.
이렇게 쌓아 놓으면 긴 사각 기둥이 된다. 이 사각 기둥에는 4개의 긴 옆면이 있다. 이 4개의 옆면중에서 어느 한 면의 숫자의 합이 최대가 되도록 주사위를 쌓고자 한다. 이렇게 하기 위하여 각 주사위를 위 아래를 고정한 채 옆으로 90도, 180도, 또는 270도 돌릴 수 있다. 한 옆면의 숫자의 합의 최대값을 구하는 프로그램을 작성하시오.
[Copy]5 2 3 1 6 5 4 3 1 2 4 6 5 5 6 4 1 3 2 1 3 6 2 4 5 4 1 6 5 2 3 | [Copy]29 |
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 | /************************************************************** Problem: 1147 User: a132034 Language: C++ Result: Success Time:5 ms Memory:1396 kb ****************************************************************/ #include <cstdio> #include <algorithm> #pragma warning(disable : 4996) int dice[11111][7]; int td[7]; int N; int find(int num, int h) { //만약 h(높이)가 N이 되었다면 리턴 if (h > N) return 0; int loc = 0; //num이 들어있는 location을 확인 for (int i = 1; i <= 6; ++i) { //top의 위치 if (dice[h][i] == num) { loc = i; break; } } int max = 0; for (int i = 1; i <= 6; ++i) { if (i == loc || i == td[loc]) continue; if (max < dice[h][i]) max = dice[h][i]; } return max + find(dice[h][td[loc]], h + 1); } int main() { scanf("%d", &N); for (int i = 1; i <= N; ++i) scanf("%d%d%d%d%d%d", &dice[i][1], &dice[i][2], &dice[i][3], &dice[i][4], &dice[i][5], &dice[i][6]); //위치 td[1] = 6; td[6] = 1; td[2] = 4; td[4] = 2; td[3] = 5; td[5] = 3;; int res = 0; for (int i = 1; i <= 6; ++i) // 아래쪽에 1~6이 오는 모든 경우의 맥스값 { res = std::max(res, find(i, 1)); } printf("%d", res); return 0; } | cs |
핵심은 맞은편에 있는수가 몇인지 알아내는 것.
find(i,x)는 가장 아래쪽(x는 높이를 의미하는데 1이므로 가장 낮은 높이)에 i가 올 경우의 최대값 을 구하는 함수이다.
1,1~6,1중 가장 높은 값이 결과값이 된다.
'PARK > ALGORITHM' 카테고리의 다른 글
실력키우기 색종이(중)(C++) (0) | 2016.09.19 |
---|---|
실력키우기 오목(C++) (0) | 2016.09.19 |
BOJ 1963 소수 경로(C++) (0) | 2016.09.09 |
알고리즘 & BOJ 2302 극장좌석(C++) (0) | 2016.09.08 |
실력키우기 색종이(초)(C++) (0) | 2016.09.08 |