문제 : 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;
	}
}