본문 바로가기

code/BOJ

백준 14499 주사위 굴리기

문제:

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

코드:

문제에 주어진 주사위 전개도로 dice의 인덱스를 고정한다.

회전으로 주사위 각 면의 숫자가 src 인덱스에서 dst 인덱스로 옮겨지는 것이지,

인덱스 자체가 변하는 것이 아니다.

dst기준으로 매칭되는 src의 인덱스를 찾을 때, dst에 오름차순 등의 규칙을 두어

일관성을 유지해야 인덱스 매칭을 더 정확하게 수행할 수 있다.

#include <iostream>
#define f(i, n) for(int i = 0; i < (n); ++i)
using namespace std;
int map[20][20];
int R, C, r, c, K, d;
int dice[2][6] = { 0 }; bool cp;
int src[4][4] = {
{ 3, 0, 5, 2 },
{ 2, 5, 0, 3 },
{ 4, 0, 5, 1 },
{ 1, 5, 0, 4 }
};
int dst[4][4] = {
{ 0, 2, 3, 5 },
{ 0, 2, 3, 5 },
{ 0, 1, 4, 5 },
{ 0, 1, 4, 5 }
};
int rst[4][2] = {
{1, 4},
{1, 4},
{2, 3},
{2, 3},
};
int dr[] = { 0, 0, -1, 1 };
int dc[] = { 1, -1, 0, 0 };
void rot(int d) {
	f(p, 4) dice[!cp][dst[d][p]] = dice[cp][src[d][p]];
	f(p, 2) dice[!cp][rst[d][p]] = dice[cp][rst[d][p]];
	cp = !cp;
}
int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> R >> C >> r >> c >> K;
	f(r, R) f(c, C) cin >> map[r][c];
	while (K--) {
		cin >> d; --d;
		r += dr[d], c += dc[d];
		if (r < 0 || R <= r || c < 0 || C <= c) {
			r -= dr[d], c -= dc[d]; continue;
		}
		rot(d);
		if (!map[r][c]) 
			map[r][c] = dice[cp][5];
		else {
			dice[cp][5] = map[r][c];
			map[r][c] = 0;
		}
		cout << dice[cp][0] << '\n';
	}
	return 0;
}

 

이것을 잘 정리한 코드로 숏코딩 8위에 올랐다.