반응형
문제 : https://www.acmicpc.net/problem/14499
서론
시뮬레이션 문제.
문제 이해가 필요하며 잘 읽어야한다.
주사위는 최초에 모든 면이 0이다. 전개도의 숫자가 아니다.
풀이
특정 방향으로 이동할때마다 전개도가 바뀌는데, 바뀐 전개도를 알면 나머지는 쉽게 구현 가능하다.
이동할때 바뀌는 전개도는 일일이 만들어가며 찾았다.
최초의 전개도
동 | 서 | 남 | 북 | 위 | 아래 |
3 | 4 | 2 | 5 | 1 | 6 |
각 방향으로 이동했을때 전개도
동 | 서 | 남 | 북 | 위 | 아래 | |
최초 | 3 | 4 | 2 | 5 | 1 | 6 |
동 | 1 | 6 | 2 | 5 | 4 | 3 |
서 | 6 | 1 | 2 | 5 | 3 | 4 |
남 | 3 | 4 | 1 | 6 | 5 | 2 |
북 | 3 | 4 | 6 | 1 | 2 | 5 |
구현
// c++
#include <iostream>
#include <cstring>
using namespace std;
int map[20][20];
int dir[6] = { 0, }; // 동 서 남 북 위 아래
int dy[4] = { 0, 0, -1, 1 };
int dx[4] = { 1, -1, 0, 0 };
int n, m;
int y, x;
int k;
void init() {
cin >> n >> m >> y >> x >> k;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> map[i][j];
}
}
}
int main() {
init();
while (k--) {
int op;
cin >> op;
int ny = y + dy[op - 1];
int nx = x + dx[op - 1];
if (ny >= 0 && nx >= 0 && ny < n && nx < m) {
y = ny;
x = nx;
}
else continue;
int east = dir[0];
int west = dir[1];
int up = dir[4];
int down = dir[5];
if (op == 1) { // 동쪽, 162543
dir[0] = dir[4];
dir[1] = dir[5];
dir[4] = west;
dir[5] = east;
}
else if (op == 2) { // 서쪽, 612534
dir[0] = dir[5];
dir[1] = dir[4];
dir[4] = east;
dir[5] = west;
}
else if (op == 3) { // 북쪽, 346125
dir[4] = dir[2];
dir[5] = dir[3];
dir[2] = down;
dir[3] = up;
}
else if (op == 4) { // 남쪽, 341652
dir[4] = dir[3];
dir[5] = dir[2];
dir[2] = up;
dir[3] = down;
}
if (map[y][x] == 0) map[y][x] = dir[5];
else {
dir[5] = map[y][x];
map[y][x] = 0;
}
cout << dir[4] << endl;
}
}
최근댓글