반응형
14499번 주사위 굴리기
1. 이해하기
- 주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있다.
- 가장 처음에 주사위에는 모든 면에 0이 적혀져 있다.
- 지도의 각 칸에는 정수가 하나씩 쓰여져 있다.
- 주사위를 굴렸을 때, 이동한 칸에 쓰여있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다.
- 주사위를 굴렸을 때, 이동한 칸에 쓰여있는 수가 0이 아니면 칸의 수가 주사위의 바닥면으로 복사되고 칸에 쓰여 있는 수는 0이 된다.
- 주사위를 지도의 바깥으로 이동시키는 명령은 무시하며 출력도 하지 않는다.
- 주사위가 이동할 때마다 주사위의 상단에 쓰여 있는 값을 출력하는 문제.
- 주사위를 직접 만들어 보거나 그려서 이해하는 시뮬레이션 문제.
2. 구현하기
-
주사위를 그려서 동쪽, 서쪽, 북쪽, 남쪽으로 이동시켰을 때 주사위의 각 면이 어떻게 이동하는지 보고 표현한다.
void rotate(int dir) { if(dir == 1) { int temp = dice[0]; dice[0] = dice[3]; dice[3] = dice[5]; dice[5] = dice[2]; dice[2] = temp; } else if(dir == 2) { int temp = dice[0]; dice[0] = dice[2]; dice[2] = dice[5]; dice[5] = dice[3]; dice[3] = temp; } else if(dir == 3) { int temp = dice[0]; dice[0] = dice[1]; dice[1] = dice[5]; dice[5] = dice[4]; dice[4] = temp; } else if(dir == 4) { int temp = dice[0]; dice[0] = dice[4]; dice[4] = dice[5]; dice[5] = dice[1]; dice[1] = temp; } }
-
각 명령에 맞는 방향으로 이동시켜주며 주사위 상단의 숫자를 출력한다.
void play(int& x, int& y, int dir) { int nx = x+dx[dir], ny = y+dy[dir]; if(nx < 0 or nx >= N or ny < 0 or ny >= M) return; rotate(dir); if(map[nx][ny] == 0) map[nx][ny] = dice[5]; else { dice[5] = map[nx][ny]; map[nx][ny] = 0; } cout << dice[0] << '\n'; x = nx; y = ny; }
3. 전체 코드
#include <iostream>
using namespace std;
int map[20][20];
int dice[6];
int dx[] = {0,0,0,-1,1};
int dy[] = {0,1,-1,0,0};
int N,M;
void rotate(int dir) {
if(dir == 1) {
int temp = dice[0];
dice[0] = dice[3];
dice[3] = dice[5];
dice[5] = dice[2];
dice[2] = temp;
} else if(dir == 2) {
int temp = dice[0];
dice[0] = dice[2];
dice[2] = dice[5];
dice[5] = dice[3];
dice[3] = temp;
} else if(dir == 3) {
int temp = dice[0];
dice[0] = dice[1];
dice[1] = dice[5];
dice[5] = dice[4];
dice[4] = temp;
} else if(dir == 4) {
int temp = dice[0];
dice[0] = dice[4];
dice[4] = dice[5];
dice[5] = dice[1];
dice[1] = temp;
}
}
void play(int& x, int& y, int dir) {
int nx = x+dx[dir], ny = y+dy[dir];
if(nx < 0 or nx >= N or ny < 0 or ny >= M) return;
rotate(dir);
if(map[nx][ny] == 0) map[nx][ny] = dice[5];
else {
dice[5] = map[nx][ny];
map[nx][ny] = 0;
}
cout << dice[0] << '\n';
x = nx; y = ny;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int sx,sy,k;
cin >> N >> M >> sx >> sy >> k;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
cin >> map[i][j];
}
}
for(int i = 0; i < k; i++) {
int dir;
cin >> dir;
play(sx,sy,dir);
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 14501번 퇴사 (0) | 2019.10.03 |
---|---|
[백준] 14500번 테트로미노 (0) | 2019.10.03 |
[백준] 13458번 시험 감독 (0) | 2019.10.03 |
[백준] 3190번 뱀 (0) | 2019.10.03 |
[백준] 12100번 2048(Easy) (0) | 2019.10.03 |