https://www.acmicpc.net/problem/14499
단순 시뮬레이션 문제입니다. 하지만 주사위 굴리는 방식을 어떻게 하느냐에 따라
난이도가 달라질 것 같습니다.
저는 ndice(next dice)배열을 사용하여 주사위가 구른 다음의 위치를 임시로 저장해뒀습니다.
예를들어 예제같은 경우 처음에 남쪽으로 주사위를 굴릴때,
1번면의 자리에 2번면이 오고,
2번면의 자리에 6번면,
3번면의 자리에 3번면…..
이런식으로 자리가 바뀌기 때문에 자리의 위치를 바꿨습니다.
#include <iostream>
using namespace std;
int n, m, x, y, k;
int map[21][21];
int dice[7];
int dx[] = { 0,0,0,-1,1 };
int dy[] = { 0,1,-1,0,0 };
int main() {
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 >> map[i][j];
}
}
int order = 0;
dice[6] = map[x][y];
for (int i = 0; i < k; i++) {
cin >> order;
int nx = x + dx[order];
int ny = y + dy[order];
if (nx >= 0 && ny >= 0 && nx < n&&ny < m) {
int ndice[7] = { 0, };
if (order == 1) {
ndice[1] = dice[4];
ndice[2] = dice[2];
ndice[3] = dice[1];
ndice[4] = dice[6];
ndice[5] = dice[5];
ndice[6] = dice[3];
}
else if (order == 2) {
ndice[1] = dice[3];
ndice[2] = dice[2];
ndice[3] = dice[6];
ndice[4] = dice[1];
ndice[5] = dice[5];
ndice[6] = dice[4];
}
else if (order == 3) {
ndice[1] = dice[5];
ndice[2] = dice[1];
ndice[3] = dice[3];
ndice[4] = dice[4];
ndice[5] = dice[6];
ndice[6] = dice[2];
}
else if (order == 4) {
ndice[1] = dice[2];
ndice[2] = dice[6];
ndice[3] = dice[3];
ndice[4] = dice[4];
ndice[5] = dice[1];
ndice[6] = dice[5];
}
for (int j = 1; j < 7; j++)dice[j] = ndice[j];
if (map[nx][ny] == 0) {
map[nx][ny] = dice[6];
}
else {
dice[6] = map[nx][ny];
map[nx][ny] = 0;
}
x = nx;
y = ny;
cout << dice[1] << '\n';
}
}
}
- 나 혼자 말하고 나 혼자 듣는 말
처음에 면의 위치를 바꾸는 것이 아닌,
주사위들의 값을 바꿔주는 방식으로해서 개망했다……..
머리 굴러가는 줄….. 후…
근데 면의 위치만 바꾼다면 이렇게 쉽다니…
후… 주사위….