Muscardinus

주사위 굴리기 본문

알고리즘 문제/[삼성 SW 역량 테스트 기출 문제]

주사위 굴리기

Muscardinus 2020. 8. 21. 17:03
728x90

https://www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도

www.acmicpc.net

#include <iostream>

using namespace std;

int n, m, sx, sy, k;
int dice[6];
int ndice[6];
int map[20][20];

int dy[] = { 0,0,-1,1 }; //동서북남
int dx[] = { 1,-1,0,0 };

void move_dice(int dir) {
	switch (dir) {
	case 0:
		ndice[0] = dice[0];
		ndice[5] = dice[1];
		ndice[2] = dice[2];
		ndice[4] = dice[3];
		ndice[1] = dice[4];
		ndice[3] = dice[5];
		break;
	case 1:
		ndice[0] = dice[0];
		ndice[4] = dice[1];
		ndice[2] = dice[2];
		ndice[5] = dice[3];
		ndice[3] = dice[4];
		ndice[1] = dice[5];
		break;
	case 2:
		ndice[3] = dice[0];
		ndice[0] = dice[1];
		ndice[1] = dice[2];
		ndice[2] = dice[3];
		ndice[4] = dice[4];
		ndice[5] = dice[5];
		break;
	case 3:
		ndice[1] = dice[0];
		ndice[2] = dice[1];
		ndice[3] = dice[2];
		ndice[0] = dice[3];
		ndice[4] = dice[4];
		ndice[5] = dice[5];
		break;
	default:
		break;
	}

	for (int i = 0; i < 6; i++) {
		dice[i] = ndice[i];
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin >> n >> m >> sy >> sx >> k;
	for (int y = 0; y < n; y++) {
		for (int x = 0; x < m; x++) {
			cin >> map[y][x];
		}
	}
	int dir;
	for (int i = 0; i < k; i++) {
		cin >> dir;
		int ny = sy + dy[dir - 1];
		int nx = sx + dx[dir - 1];
		if (ny >= n || ny < 0 || nx >= m || nx < 0) continue; //범위 밖으로 나갈때
		move_dice(dir - 1); //회전
		if (map[ny][nx] == 0) {
			map[ny][nx] = dice[3];
		}
		else if (map[ny][nx]) {
			dice[3] = map[ny][nx];
			map[ny][nx] = 0;
		}
		sy = ny; sx = nx;
		cout << dice[1] << "\n";
	}
	return 0;
}
728x90

'알고리즘 문제 > [삼성 SW 역량 테스트 기출 문제]' 카테고리의 다른 글

연구소  (0) 2020.08.23
테트로미노  (0) 2020.08.22
시험 감독  (0) 2020.08.20
  (0) 2020.08.19
2048(Easy)  (0) 2020.08.18
Comments