본문 바로가기

카테고리 없음

백준 14499 주사위 굴리기

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

 

간단한 구현 문제다. 문제에 주어진 조건을 구현만 하면 된다.

 

다만 이 문제를 풀려면 제일 중요한 게 있는데 Input으로 들어오는 x,y 값이 반대다.

 

무슨 말인지는 밑의 코드에서 Input() 부분을 보기를 추천한다...

 

/* 주사위 굴리기 */

#include <iostream>

#define MAX 21

using namespace std;

int N, M, x, y, K;
int map[MAX][MAX], dice[7];
int dy[5] = { 0, 0,0,-1,1 };
int dx[5] = { 0,1,-1,0,0 };

void input();
void solve();
void roll_the_dice(int);

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	input();
	solve();

	return 0;
}

void input() {
	cin >> N >> M >> y >> x >> K;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> map[i][j];
		}
	}
}

void roll_the_dice(int operation) {
	int temp = dice[4];
		switch (operation) {
		case 1: 
			dice[4] = dice[3];
			dice[3] = dice[1];
			dice[1] = dice[6];
			dice[6] = temp;
			break;
		case 2:
			dice[4] = dice[6];
			dice[6] = dice[1];
			dice[1] = dice[3];
			dice[3] = temp;
					break; 
		case 3: 
			dice[4] = dice[5];
			dice[5] = dice[1];
			dice[1] = dice[2];
			dice[2] = temp;
			break;
		case 4:
			dice[4] = dice[2];
			dice[2] = dice[1];
			dice[1] = dice[5];
			dice[5] = temp;
			break;
		}

}

void solve() {
	for (int i = 0; i < K; i++) {
		int operation; cin >> operation;
		int nx = x + dx[operation];
		int ny = y + dy[operation];
		if (nx >= 0 && nx < M && ny >= 0 && ny < N) {
			roll_the_dice(operation);
			x = nx; y = ny;
			if (map[y][x] == 0) {
				map[y][x] = dice[4];
			}
			else  {
				dice[4] = map[y][x];
				map[y][x] = 0;
			}
			cout << dice[1] << '\n';
		}	
	}
}