Recent Posts
Recent Comments
«   2025/08   »
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
Archives
Today
Total
관리 메뉴

일상의 기록

백준 14499 - 주사위 굴리기 본문

Algorithm

백준 14499 - 주사위 굴리기

Miguel Lee 2019. 4. 5. 23:44

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