Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 다이나믹 프로그래밍
- 삼성 SDS 대학생 알고리즘 특강
- hackerrank
- PS
- 알고리즘
- BOJ
- C++
- 잠실
- 소수
- 동적 계획법
- 에라토스테네스의 체
- 삼성 기출
- dfs
- Algorithm
- 백준
- 완전탐색
- BFS
- 맛집
- 시뮬레이션
- koitp
- sw expert academy
- 구현
- dynamic programming
- DP
- 브루트포스
- SWEA
- 그리디
- 해커랭크
- 백트래킹
- 스택
Archives
- Today
- Total
펭로그
[C++] 백준 BOJ 14499 주사위 굴리기 본문
문제링크 : https://boj.kr/14499
이 문제는 약간의 노가다 문제라고 할 수 있겠다.
주사위를 굴릴 때마다 주사위에 써진 숫자의 순서가 뒤바뀌기 때문이다.
방향이 전환 되었을 때마다 어떻게 바뀌는지 전개도를 직접 바꿔보면 아래와 같이 표현 가능하다.
이러한 전개도를 기반으로 다음과 같이 배열을 만들어주고
1 2 3 4 5 6 7 | const int s[5][6] = { {1, 2, 3, 4, 5, 6}, // 0 기본 {4, 2, 1, 6, 5, 3}, // 1 동쪽 {3, 2, 6, 1, 5, 4}, // 2 서쪽 {5, 1, 3, 4, 6, 2}, // 3 북쪽 {2, 6, 3, 4, 1, 5} // 4 남쪽 }; | cs |
주사위가 재배치 되었을때 재배치 작업을 거쳐주면 된다.
1 2 3 4 5 6 7 | void update(int dir) { int tmp[6]; for (int i = 0; i < 6; i++) tmp[i] = dice[i]; for (int i = 0; i < 6; i++) dice[s[dir][i] - 1] = tmp[i]; } | cs |
이 작업이 생각보다 머리아프고 숫자 실수하게 되면 정말 골치아프게 되버리니 신중하게 작성해야 한다.
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 | // BOJ 14499 주사위 굴리기 #include <iostream> #include <vector> using namespace std; int x, y; // 좌표 int dice[6]; // 주사위 vector<vector<int> > arr; // 지도 // 전개도 const int s[5][6] = { {1, 2, 3, 4, 5, 6}, // 0 기본 {4, 2, 1, 6, 5, 3}, // 1 동쪽 {3, 2, 6, 1, 5, 4}, // 2 서쪽 {5, 1, 3, 4, 6, 2}, // 3 북쪽 {2, 6, 3, 4, 1, 5} // 4 남쪽 }; const int dx[5] = {0, 0, 0, -1, 1}; const int dy[5] = {0, 1, -1, 0, 0}; // 명령 후 주사위 재배치 void update(int dir) { int tmp[6]; for (int i = 0; i < 6; i++) tmp[i] = dice[i]; for (int i = 0; i < 6; i++) dice[s[dir][i] - 1] = tmp[i]; } // 복사 void copy() { if (arr[x][y] == 0) arr[x][y] = dice[5]; else { dice[5] = arr[x][y]; arr[x][y] = 0; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); freopen("../input.txt", "r", stdin); int N, M, num; cin >> N >> M >> x >> y >> num; arr.assign(N + 2, vector<int>(M + 2, -1)); for (int i = 1; i <= N; i++) for (int j = 1; j <= M; j++) cin >> arr[i][j]; x++, y++; // 계산 편의상 1씩 추가 copy(); // 맨 처음 위치 복사 int cmd, xx, yy; while (num--) { cin >> cmd; xx = x + dx[cmd]; yy = y + dy[cmd]; // 맵 범위 체크 if (arr[xx][yy] == -1) continue; else x = xx, y = yy; // 좌표 업데이트 update(cmd); // 주사위 업데이트 copy(); // 복사 cout << dice[0] << '\n'; // 맨 위에 있는 값 출력 } return 0; } | cs |
'Study > PS(Algorithm)' 카테고리의 다른 글
[C++] 백준 BOJ 1547 공 (0) | 2018.09.18 |
---|---|
[C++] 백준 BOJ 3190 뱀 (0) | 2018.09.18 |
[C++] 백준 BOJ 11048 이동하기 (0) | 2018.09.17 |
Codeforces Round #509 (Div. 2) 후기 (0) | 2018.09.16 |
[C++] 백준 BOJ 14503 로봇 청소기 (0) | 2018.09.14 |
Comments