문제 링크 : 백준 14499번
구현문제이다.
나는 주사위의 면위치을 나타내는 dirdice배열과 해당 위치에 있는 주사위의 값을 나타내는 dice배열을 이용해 구현했다.
주사위의 면위치를 나타내는 모습(dirdice배열)이 라고 하면
과 같은 규칙을 가진다.
ex) dirdice의 0번째 인덱스가 5면 dice[5]에 있는 값이 주사위 윗면에 있는 값이다.
dirdice배열에 있는 값을 dice배열의 인덱스에 넣어가면서 주사위 값들을 변경해주면 된다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n,m,x,y,k;
int arr[21][21];
int dice[6];
int dirdice[6];
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
void go(int dir) {
if(dir == 0) {
int temp = dirdice[4];
dirdice[4] = dirdice[0];
dirdice[0] = dirdice[5];
dirdice[5] = dirdice[2];
dirdice[2] = temp;
}
else if(dir == 1) {
int temp = dirdice[2];
dirdice[2] = dirdice[5];
dirdice[5] = dirdice[0];
dirdice[0] = dirdice[4];
dirdice[4] = temp;
}
else if(dir == 2) {
int temp = dirdice[3];
dirdice[3] = dirdice[2];
dirdice[2] = dirdice[1];
dirdice[1] = dirdice[0];
dirdice[0] = temp;
}
else {
int temp = dirdice[0];
dirdice[0] = dirdice[1];
dirdice[1] = dirdice[2];
dirdice[2] = dirdice[3];
dirdice[3] = temp;
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> x >> y >> k;
for(int i=0 ; i<n ; i++)
for(int j=0 ; j<m ; j++) cin >> arr[i][j];
for(int i=0 ; i<6 ; i++) dirdice[i] = i;
for(int i=0 ; i<k ; i++) {
int dir;
cin >> dir;
dir-=1;
int nx = x + dx[dir];
int ny = y + dy[dir];
if(nx<0 || ny<0 || nx>=n || ny>=m) continue;
go(dir); // 주사위 굴리기
// 0이 윗면, 2가 아랫면
if(arr[nx][ny] == 0) {
arr[nx][ny] = dice[dirdice[2]];
}
else {
dice[dirdice[2]] = arr[nx][ny];
arr[nx][ny] = 0;
}
cout << dice[dirdice[0]] << "\n";
x = nx, y = ny;
}
return 0;
}