어흥
[백준 14499] 주사위 굴리기 (C++) 본문
728x90
반응형
문제 링크: https://www.acmicpc.net/problem/14499
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