어흥

[백준 14499] 주사위 굴리기 (C++) 본문

알고리즘/백준

[백준 14499] 주사위 굴리기 (C++)

라이언납시오 2020. 3. 10. 20:28
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개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

1. 주의할 점

- 주사위의 전개도를 기준으로 해당 면이 배열 Dice의 몇번째 index와 짝을 이루는지 정한다. 나는 다음과 같이 정의했다

   0

1  2  3

   4

   5

- 구현을 정확히 한다. 이동 -> Dice 배열값 초기화 -> 지도의 밑면 확인 후 작업 수행

 

2. 구현 

- 주사위의 밑면을 먼저 가상으로 이동시켜보고 배열 범위의 밖이면 명령 수행 X

- 이동 위치가 배열범위 안이면 주사위 이동(MV 함수 수행) -> 주사위 밑면의 좌표 이동

- 이동 위치의 지도값 == 0 : 주사위의 밑면에 적힌 값이 지도에 복사된다.

- 이동 위치의 지도값 != 0 : 지도에 적힌 숫자 -> 주사위의 밑면에 복사 -> 지도 숫자 = 0

 

#include <iostream>
using namespace std;
int arr[20][20];
int row, col, order, sx, sy, val;
int dice[6] = { 0,0,0,0,0,0 };
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,-1,1 };

void mv(int dir) {
	if (dir == 0) {				//동쪽
		int tt = dice[3];
		dice[3] = dice[2]; 
		dice[2] = dice[1]; 
		dice[1] = dice[5]; 
		dice[5] = tt;
	}
	else if (dir == 1) {			//서쪽
		int tt = dice[1];
		dice[1] = dice[2];
		dice[2] = dice[3];
		dice[3] = dice[5];
		dice[5] = tt;
	}
	else if (dir == 2) {			//북쪽
		int tt = dice[2];
		dice[2] = dice[4];
		dice[4] = dice[5];
		dice[5] = dice[0];
		dice[0] = tt;
	}
	else {					//남쪽
		int tt = dice[5];
		dice[5] = dice[4];
		dice[4] = dice[2];
		dice[2] = dice[0];
		dice[0] = tt;
	}
}

int main() {
	cin >> row >> col >> sy >> sx >> order;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			cin >> arr[i][j];

	for (int t = 0; t < order; t++) {
		cin >> val;
		val -= 1;
		int nx = sx + dx[val];
		int ny = sy + dy[val];
		if (nx >= 0 && ny >= 0 && nx < col && ny < row) {
			mv(val);		//방향바꾸기
			sx = nx;
			sy = ny;
			if (arr[sy][sx] == 0)
				arr[sy][sx] = dice[5];
			else {
				dice[5] = arr[sy][sx];
				arr[sy][sx] = 0;
			}
			cout << dice[2] << '\n';
		}
		else continue;		//범위밖으로 나가는것은 무시
	}
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1072] 게임 (C++)  (0) 2020.03.11
[백준 12786] INHA SUIT (C++)  (0) 2020.03.10
[백준 3020] 개똥벌레 (C++)  (0) 2020.03.10
[백준 3079] 입국심사 (C++)  (0) 2020.03.10
[백준 1707] 이분 그래프 (C++, Java)  (0) 2020.03.10
Comments