문제:
코드:
문제에 주어진 주사위 전개도로 dice의 인덱스를 고정한다.
회전으로 주사위 각 면의 숫자가 src 인덱스에서 dst 인덱스로 옮겨지는 것이지,
인덱스 자체가 변하는 것이 아니다.
dst기준으로 매칭되는 src의 인덱스를 찾을 때, dst에 오름차순 등의 규칙을 두어
일관성을 유지해야 인덱스 매칭을 더 정확하게 수행할 수 있다.
#include <iostream>
#define f(i, n) for(int i = 0; i < (n); ++i)
using namespace std;
int map[20][20];
int R, C, r, c, K, d;
int dice[2][6] = { 0 }; bool cp;
int src[4][4] = {
{ 3, 0, 5, 2 },
{ 2, 5, 0, 3 },
{ 4, 0, 5, 1 },
{ 1, 5, 0, 4 }
};
int dst[4][4] = {
{ 0, 2, 3, 5 },
{ 0, 2, 3, 5 },
{ 0, 1, 4, 5 },
{ 0, 1, 4, 5 }
};
int rst[4][2] = {
{1, 4},
{1, 4},
{2, 3},
{2, 3},
};
int dr[] = { 0, 0, -1, 1 };
int dc[] = { 1, -1, 0, 0 };
void rot(int d) {
f(p, 4) dice[!cp][dst[d][p]] = dice[cp][src[d][p]];
f(p, 2) dice[!cp][rst[d][p]] = dice[cp][rst[d][p]];
cp = !cp;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> R >> C >> r >> c >> K;
f(r, R) f(c, C) cin >> map[r][c];
while (K--) {
cin >> d; --d;
r += dr[d], c += dc[d];
if (r < 0 || R <= r || c < 0 || C <= c) {
r -= dr[d], c -= dc[d]; continue;
}
rot(d);
if (!map[r][c])
map[r][c] = dice[cp][5];
else {
dice[cp][5] = map[r][c];
map[r][c] = 0;
}
cout << dice[cp][0] << '\n';
}
return 0;
}
이것을 잘 정리한 코드로 숏코딩 8위에 올랐다.