[14499] 주사위 굴리기
풀이
- 주사위 면의 이동을 잘 구현하면 된다.
기본 구현 문제인제 뭐가 틀린 것인지 아직 모르겠다. n을 m으로 적는 오타가 있었다.
코드
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
int n = 0, m = 0, x = 0, y = 0, k = 0;
int map[20][20];
int side[6];
//우, 좌, 하, 상
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };
#define CEIL 0
#define FRONT 1
#define FLOOR 2
#define REAR 3
#define LEFT 4
#define RIGHT 5
#define ROLL_RIGHT 1
#define ROLL_LEFT 2
#define ROLL_UP 3
#define ROLL_DOWN 4
void rollroll(int opt) {
int temp = 0;
switch (opt){
case ROLL_RIGHT:
//printf("ROLL_RIGHT\n");
temp = side[CEIL];
side[CEIL] = side[LEFT];
side[LEFT] = side[FLOOR];
side[FLOOR] = side[RIGHT];
side[RIGHT] = temp;
break;
case ROLL_LEFT:
//printf("ROLL_LEFT\n");
temp = side[CEIL];
side[CEIL] = side[RIGHT];
side[RIGHT] = side[FLOOR];
side[FLOOR] = side[LEFT];
side[LEFT] = temp;
break;
case ROLL_UP:
//printf("ROLL_UP\n");
temp = side[CEIL];
side[CEIL] = side[FRONT];
side[FRONT] = side[FLOOR];
side[FLOOR] = side[REAR];
side[REAR] = temp;
break;
case ROLL_DOWN:
//printf("ROLL_DOWN\n");
temp = side[CEIL];
side[CEIL] = side[REAR];
side[REAR] = side[FLOOR];
side[FLOOR] = side[FRONT];
side[FRONT] = temp;
break;
defulat:
printf("Error\n");
break;
}
}
int main(void) {
scanf("%d%d%d%d%d", &n, &m, &x, &y, &k);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &map[i][j]);
}
}
vector<int> op;
for (int i = 0; i < k; i++) {
int opt = 0;
scanf("%d", &opt);
op.push_back(opt);
}
for (int i = 0; i < k; i++) {
//현재 위치 갱신 유효한지 확인
//op[i]가 11이라면 동쪽으로 이동 : dx[0], dy[0]
//범위 벗어나서 이동하면 안되는 상황일 때는 바닥과 상호작용 없음
if (x + dx[op[i] -1] < 0 || x + dx[op[i] -1] >= n) continue;
if (y + dy[op[i] -1] < 0 || y + dy[op[i] -1] >= m) continue;
// 굴리기
rollroll(op[i]);
//현재 위치 갱신
x += dx[op[i] -1];
y += dy[op[i] -1];
//숫자 복사
if (map[x][y] == 0) {
map[x][y] = side[FLOOR];
}
else {
side[FLOOR]= map[x][y];
map[x][y] = 0;
}
//윗면 출력하기
printf("%d\n", side[CEIL]);
}
return 0;
}