문제 링크: 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;
}
반응형