문제 링크: https://www.acmicpc.net/problem/14499
어렵지 않습니다. 주사위 배열을 만들어서 직접 굴려주면 됩니다. std::swap을 적절히 사용해주면 됩니다.
방향과 x, y 순서가 헷갈릴 수 있습니다. 방향 1234가 '동서북남'인 점 유의하시고, 주사위 놓는 곳의 x, y 좌표에 유의하면 쉽게 풀 수 있습니다
주사위 문제는 언제나 귀찮습니다 ㅠ
#pragma GCC optimize ("Ofast")
#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#include <bits/stdc++.h>
using namespace std;
// 0123: 동서북남
const int dy[] = {0, 0, -1, 1};
const int dx[] = {1, -1, 0, 0};
int mapp[20][20];
int n, m, x, y, k;
// 주사위 인덱스
// 1
// 3 0 2
// 4
// 5
int dice[6];
// dir 방향으로 굴림
void roll(int dir) {
if (dir == 0) {
swap(dice[3], dice[0]);
swap(dice[0], dice[2]);
swap(dice[2], dice[5]);
}
else if (dir == 1) {
swap(dice[5], dice[2]);
swap(dice[2], dice[0]);
swap(dice[0], dice[3]);
}
else if (dir == 2) {
swap(dice[5], dice[4]);
swap(dice[4], dice[0]);
swap(dice[0], dice[1]);
}
else {
swap(dice[0], dice[1]);
swap(dice[4], dice[0]);
swap(dice[5], dice[4]);
}
}
inline bool in_range(int y, int x) {
return y >= 0 && y < n && x >= 0 && x < m;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
// x, y 순서 주의
cin >> n >> m >> y >> x >> k;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
cin >> mapp[i][j];
while (k--) {
int d;
cin >> d;
--d;
if (in_range(y+dy[d], x+dx[d])) {
roll(d);
y += dy[d], x += dx[d];
if (mapp[y][x] == 0) {
mapp[y][x] = dice[0];
}
else {
dice[0] = mapp[y][x];
mapp[y][x] = 0;
}
cout << dice[5] << '\n';
}
}
return 0;
}
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 4659: 비밀번호 발음하기 (0) | 2020.07.22 |
---|---|
[백준][C++] 14430: 자원 캐기 (0) | 2020.07.22 |
[백준][C++] 14503: 로봇 청소기 (0) | 2020.07.21 |
[백준][C++] 17946: 피자는 나눌 수록 커지잖아요 (0) | 2020.07.20 |
[백준][C++] 17953: 디저트 (0) | 2020.07.20 |