[백준/BOJ] 백준 14499번 : 주사위 굴리기

2020. 9. 8. 02:27알고리즘 문제풀이

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

int dice[6]로 주사위의 각 면(0:왼쪽, 1:뒤쪽, 2:오른쪽, 3:앞쪽, 4:위, 5:아래)의 숫자를 표현했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int n, m, x, y, k;
int board[20][20];
vector<int> command;
int dxdy[5][2] = { {0,0}, {0,1},{0,-1},{-1,0},{1,0} }; //1:동쪽 2:서쪽 3:북쪽 4:남쪽
int dice[6] = { 0,0,0,0,0,0 }; //왼쪽, 뒤쪽, 오른쪽, 앞쪽, 위, 아래
int temp_dice[6] = { 0,0,0,0,0,0 };

void Solve(pair<int, int> start)
{
	pair<int, int> here = start;

	for (int i = 0; i < command.size(); i++)
	{
		//명령으로 이동되는 위치
		pair<int, int> there = make_pair(here.first + dxdy[command[i]][0], here.second + dxdy[command[i]][1]);

		//바깥으로 이동되는 경우
		if (there.first < 0 || there.first >= n || there.second < 0 || there.second >= m)
		{
			continue;
		}

		//동쪽으로 이동일때
		if (command[i] == 1)
		{
			temp_dice[0] = dice[5];
			temp_dice[1] = dice[1];
			temp_dice[2] = dice[4];
			temp_dice[3] = dice[3];
			temp_dice[4] = dice[0];
			temp_dice[5] = dice[2];
		}

		//서쪽으로 이동일때
		else if (command[i] == 2)
		{
			temp_dice[0] = dice[4];
			temp_dice[1] = dice[1];
			temp_dice[2] = dice[5];
			temp_dice[3] = dice[3];
			temp_dice[4] = dice[2];
			temp_dice[5] = dice[0];
		}

		//북쪽으로 이동일때
		else if (command[i] == 3)
		{
			temp_dice[0] = dice[0];
			temp_dice[1] = dice[4];
			temp_dice[2] = dice[2];
			temp_dice[3] = dice[5];
			temp_dice[4] = dice[3];
			temp_dice[5] = dice[1];
		}

		//남쪽으로 이동일때
		else if (command[i] == 4)
		{
			temp_dice[0] = dice[0];
			temp_dice[1] = dice[5];
			temp_dice[2] = dice[2];
			temp_dice[3] = dice[4];
			temp_dice[4] = dice[1];
			temp_dice[5] = dice[3];
		}

		for (int i = 0; i < 6; i++)
			dice[i] = temp_dice[i];

		//이동하는 칸에 0이 쓰여 있을때
		if (board[there.first][there.second] == 0)
		{
			board[there.first][there.second] = dice[5];
		}

		//이동하는 칸에 0이 쓰여 있지 않을때
		else
		{
			dice[5] = board[there.first][there.second];
			board[there.first][there.second] = 0;
		}

		//주사위 윗면을 출력
		cout << dice[4] << "\n";

		here = there;
	}
}

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

	cin >> n >> m >> x >> y >> k;

	int input;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			cin >> input;
			board[i][j] = input;
		}

	for (int i = 0; i < k; i++)
	{
		cin >> input;
		command.push_back(input);
	}

	pair<int, int> start = make_pair(x, y);

	Solve(start);

	return 0;
}