일상의 기록
백준 14499 - 주사위 굴리기 본문
https://www.acmicpc.net/problem/14499
주사위를 각 방향으로 굴릴 때 어떻게 변하는지를 생각하는 게 생각보다 오래 걸렸다.
또한, 문제가 꼬여있는 부분이 두 군데 존재한다. x가 높이로, y가 너비로 주어졌다는 것. 즉 통상적인 문제와 x, y좌표가 반대로 주어져 있다.
두 번째로, 통상적으로 동서남북 순으로 생각하기 마련인데, 이 문제에서는 동서북남 순서로 주어져 있다.
문제를 꼼꼼히 읽는 것의 중요성을 알려주는 문제라고 생각한다.
#include<iostream>
#include<vector>
using namespace std;
int n, m, x, y, k = 0;
int dx[] = { 0, 1, -1, 0, 0 };
int dy[] = { 0, 0, 0, -1, 1 };
vector<int> dice(6, 0);
/* 주사위는 각 1
3 0 2
4
5 의 면으로 되어 있으며, 최초 0이 top, 2가 동쪽
매 경우 어떤 면이 top에 있고, 이 때 동서남북중 하나의 방향으로 굴렸을 때 어떤 면이 top이 되는지, 어떤 면이 bottom이 되는지 확인한다.
현재 주사위가 있는 곳에서 bottom과 map을 비교하고, map이 0이면 주사위의 bottom 수를 map에 복사, map이 0이 아니면 map을 주사위의 bottom에 복사하고 map은 0이 됨
매 경우 주사위의 top을 출력하고, 주사위가 map을 벗어난 범위를 움직이려 할 때 무시.
*/
void roll(int a) {
vector<int> temp = dice;
switch (a) {
case 1: // 동
dice[0] = temp[3];
dice[2] = temp[0];
dice[3] = temp[5];
dice[5] = temp[2];
break;
case 2: // 서
dice[0] = temp[2];
dice[2] = temp[5];
dice[3] = temp[0];
dice[5] = temp[3];
break;
case 4: // 남
dice[0] = temp[1];
dice[1] = temp[5];
dice[4] = temp[0];
dice[5] = temp[4];
break;
case 3: // 북
dice[0] = temp[4];
dice[1] = temp[0];
dice[4] = temp[5];
dice[5] = temp[1];
break;
}
}
int main() {
cin >> n >> m >> y >> x >> k;
vector<vector<int>> map(n, vector<int>(m, 0));
vector<int> answer;
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 command = 0;
cin >> command;
if (x + dx[command] >= 0 && x + dx[command] < m && y + dy[command] >= 0 && y + dy[command] < n) {
x += dx[command];
y += dy[command];
roll(command);
if (map[y][x] == 0) {
map[y][x] = dice[5];
}
else if (map[y][x] != 0) {
dice[5] = map[y][x];
map[y][x] = 0;
}
cout << dice[0]<<endl;
}
}
return 0;
}
'Algorithm' 카테고리의 다른 글
백준 14503 - 로봇 청소기 (0) | 2019.04.06 |
---|---|
백준 14501 - 퇴사 (0) | 2019.04.06 |
백준 13458 - 시험 감독 (0) | 2019.04.05 |
백준 14500 - 테트로미노 (0) | 2019.04.05 |
백준 12100 - 2048(easy) (0) | 2019.04.05 |