14499번: 주사위 굴리기
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도
www.acmicpc.net
처음엔 어떻게 풀어야할지 아예 감이 안잡히는 문제였다.
주사위를 구현해야하는데 방향까지 고려해서 구현을 해야한다고 생각을 했었다.
하지만 전개도 번호를 고정으로 잡고 그 안의 값들만 변경 시켜서 구현하니 바로 풀리는 문제였다.
각각 동서남북으로 이동하면서 조건 확인 및 좌표수정, 주사위 바닥면을 복사해주고, 주사위 면들을 옮겼다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, M, x, y, K;
int map[21][21];
int dice[7];
void cp(int a) { //주사위 바닥면 복사
if (map[x][y] == 0) {
map[x][y] = dice[a];
}
else {
dice[a] = map[x][y];
map[x][y] = 0;
}
}
int main() {
int z, tmp;
cin >> N >> M >> x >> y >> K;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> map[i][j];
}
}
for (int i = 0; i < K; i++) {
cin >> z;
if (z == 1) { //동쪽 이동
if (y + 1 < M) {
y++;
cp(3);
tmp = dice[1];
dice[1] = dice[3];
dice[3] = dice[6];
dice[6] = dice[4];
dice[4] = tmp;
cout << dice[6] << "\n";
}
}
else if (z == 2) { //서쪽 이동
if (y - 1 >= 0) {
y--;
cp(4);
tmp = dice[1];
dice[1] = dice[4];
dice[4] = dice[6];
dice[6] = dice[3];
dice[3] = tmp;
cout << dice[6] << "\n";
}
}
else if (z == 3) { //북쪽 이동
if (x - 1 >= 0) {
x--;
cp(2);
tmp = dice[1];
dice[1] = dice[2];
dice[2] = dice[6];
dice[6] = dice[5];
dice[5] = tmp;
cout << dice[6] << "\n";
}
}
else {
if (x + 1 < N) { //남쪽 이동
x++;
cp(5);
tmp = dice[1];
dice[1] = dice[5];
dice[5] = dice[6];
dice[6] = dice[2];
dice[2] = tmp;
cout << dice[6] << "\n";
}
}
}
return 0;
}
'알고리즘 공부 > C++' 카테고리의 다른 글
[C++] 백준 15686번: 치킨 배달 (0) | 2021.04.09 |
---|---|
[C++] 백준 15683번: 감시 (0) | 2021.04.08 |
[C++] 백준 16234번: 인구 이동 (0) | 2021.03.25 |
[C++] 백준 14500번: 테트로미노 (0) | 2021.03.25 |
[C++] 백준 3190번: 뱀 (0) | 2021.03.19 |