문제 링크
https://www.acmicpc.net/problem/14499
아이디어
- 주사위를 굴리는 것의 구현은 주사위의 6개 면에 전개도에 나와있는 숫자로 각각 idx를 부여하면 간단하다.
마주보는 idx끼리 짝을 이루어보면 (1,6), (2,5), (3,4)로 (x, 7-x)꼴을 이루는 것을 확인 할 수 있다. - 주사위를 보았을 때, u, f, s를 각각 윗면, 정면, 오른쪽면의 idx라고 하면, 초기의 (u, f, s) = (1, 5, 3)이다.
- 이제, 문제에 기술된 순서대로 하나하나 구현하면 된다.
1. 다음 명령이 유효하지 않다면 무시하고
2. 입력으로 주어진 방향에 따라 굴려준다.
예를 들어, 주사위를 동쪽으로 굴리면 u는 7-s값으로, s = u의 값으로, f는 유지된다.
3. 주사위가 위치한 칸에 적혀있는 값에 따라 적절히 처리한다.
주의할 점
- roll() 처리를 할 때, 이전의 값을 저장해야 올바른 값으로 갱신할 수 있다.
b = a;
a = 7-b; 로 작성하지 않음에 유의하자.
소스코드
#include<cstdio> #include<vector> using namespace std; const int dx[5] = {0,0,0,-1,1 }; const int dy[5] = {0,1,-1,0,0 }; bool check(int x, int y, int bx, int by) { if (x >= 0 && x < bx && y >= 0 && y < by) return true; return false; } void roll(int& a, int& b) { int tmp = 7-b; b = a; a = tmp; } int main() { int n, m, x, y, k, board[22][22]; scanf("%d %d %d %d %d", &n, &m, &x, &y, &k); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { scanf("%d", &board[i][j]); } } int dice[7] = { 0,0,0,0,0,0,0 }; int op, u = 1, f = 5, s = 3; int nx, ny; for (int i = 0; i < k; ++i) { scanf("%d", &op); nx = x + dx[op]; ny = y + dy[op]; if (!check(nx, ny, n, m)) continue; if (op == 1) { roll(u, s); y++; } else if (op == 2) { roll(s, u); y--; } else if (op == 3) { roll(f, u); x--; } else if (op == 4) { roll(u, f); x++; } if (board[x][y] == 0) { board[x][y] = dice[7 - u]; } else { dice[7 - u] = board[x][y]; board[x][y] = 0; } printf("%d\n", dice[u]); } return 0; }
공부한 것을 정리하기 위한 기록입니다.
틀린 부분이 있다면 언제나 부드럽게 알려주세요.
'PS > BOJ' 카테고리의 다른 글
[BOJ 19236] 청소년 상어 (0) | 2020.06.09 |
---|---|
[BOJ 14503] 로봇청소기 (0) | 2020.05.15 |
[BOJ 1421] 나무꾼 이다솜 (0) | 2020.05.08 |
[BOJ 1411] 비슷한 단어 (0) | 2020.05.07 |
[BOJ 1564] 팩토리얼5 (0) | 2020.05.04 |
댓글