CS/백준
[백준] 14499번: 주사위 굴리기 (C++)
겸둥이xz
2021. 4. 2. 18:04
반응형
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
주사위를 배열 v와 h를 통해서 표현했다.
명령에 따라서 v와 h를 규칙에 맞게 적절히 업데이트하며 조건에 맞게 코드를 작성했다.
소스코드
#include <bits/stdc++.h>
using namespace std;
int n, m, x, y, k;
int g[20][20];
int d[5][2] = {{0, 0}, {0, 1}, {0, -1}, {-1, 0}, {1, 0}};
int v[4];
int h[3];
queue<int> cmd;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> x >> y >> k;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> g[i][j];
for (int i = 0; i < k; i++) {
int c; cin >> c;
cmd.push(c);
}
while(!cmd.empty()) {
int c = cmd.front(); cmd.pop();
int nx = x + d[c][0];
int ny = y + d[c][1];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
int tmp = v[3]; // v[3]은 주사위 밑바닥, v[1]과 h[1]은 주사위 윗면
switch (c) {
case 1:
v[3] = h[2];
h[2] = h[1];
h[1] = h[0];
h[0] = tmp;
v[1] = h[1];
break;
case 2:
v[3] = h[0];
h[0] = h[1];
h[1] = h[2];
h[2] = tmp;
v[1] = h[1];
break;
case 3:
v[3] = v[0];
v[0] = v[1];
v[1] = v[2];
v[2] = tmp;
h[1] = v[1];
break;
case 4:
v[3] = v[2];
v[2] = v[1];
v[1] = v[0];
v[0] = tmp;
h[1] = v[1];
break;
}
x = nx; y = ny;
if (g[x][y] == 0) g[x][y] = v[3]; // 지도가 0일 때
else { // 0이 아님
v[3] = g[x][y];
g[x][y] = 0;
}
cout << v[1] << '\n';
}
return 0;
}
반응형