[14499] 주사위 굴리기

1 minute read

풀이

  1. 주사위 면의 이동을 잘 구현하면 된다.

기본 구현 문제인제 뭐가 틀린 것인지 아직 모르겠다. 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;
}

Categories:

Updated: