https://www.acmicpc.net/problem/14499
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
해당 문제는 시뮬레이션 유형으로 주사위를 동 / 서 / 남 / 북 으로 굴릴 때 어떻게 표현해야할지가 핵심이었던 문제이다.
초기 주사위값을 이용하여 동 / 서 / 남 / 북으로 주사위를 굴릴 때 변화하는 값을 아래 그림에 표현하였다.
이를 dice 배열에 담아주었고, 각 direction 에 맞게 주사위의 값을 갱신해주었다.
코드
#include <iostream>
#include <vector>
using namespace std;
int n, m, y, x, k, a[20][20], dice[7], dy[] = { 0, 0, -1, 1}, dx[] = { 1, -1, 0, 0 };
void diceMove(int dir)
{
if(dir == 0){ //동 == right
int temp = dice[1];
dice[1] = dice[4];
dice[4] = dice[6];
dice[6] = dice[3];
dice[3] = temp;
} else if (dir == 1) { //서 == left
int temp = dice[1];
dice[1] = dice[3];
dice[3] = dice[6];
dice[6] = dice[4];
dice[4] = temp;
} else if (dir == 2) { // 북 == up
int temp = dice[1];
dice[1] = dice[5];
dice[5] = dice[6];
dice[6] = dice[2];
dice[2] = temp;
} else { //남 == down
int temp = dice[1];
dice[1] = dice[2];
dice[2] = dice[6];
dice[6] = dice[5];
dice[5] = temp;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m >> y >> x >> k;
for(int i = 0; i < n; i++){
for(int j= 0; j < m; j++){
cin >> a[i][j];
}
}
int ny = 0, nx = 0;
while(k--){
int dir;
cin >> dir;
dir--;
ny = y + dy[dir];
nx = x + dx[dir];
if(ny < 0 || ny >= n || nx < 0 || nx >= m)
continue;
diceMove(dir);
y = ny;
x = nx;
if(a[y][x] == 0) {
a[y][x] = dice[6];
} else {
dice[6] = a[y][x];
a[y][x] = 0;
}
cout << dice[1] << "\n";
}
return 0;
}
'개발 > 알고리즘' 카테고리의 다른 글
백준 15661 링크와 스타트 (0) | 2021.06.25 |
---|---|
백준 14891 톱니바퀴 (0) | 2021.06.24 |
백준 12015 가장 긴 증가하는 부분 수열 2 C++ (0) | 2021.06.21 |
분할 정복이란(Divide & Conquer) (0) | 2021.06.21 |
백준 1520 내리막 길 java (0) | 2021.06.20 |