728x90
주사위는 6개의 면을 가진다 -> 크기 6의 배열로 관리
주사위는 앞,뒤,좌,우로 구를 때 마다 면이 바뀐다
ex) 우로 구르면, 오른쪽면이 바닥면이 된다.
=> 배열의 인덱스마다 주사위의 한 면씩 매칭시켜준다.
그리고 주사위가 특정 방향으로 구를 때마다, 바뀐 것을 원래 설정해놓은(= 매칭시켜놓은) 인덱스로 설정해주면 된다.
자세한 내용은 주석에 달아놓았다.
문제 난이도치고는 쉽게 풀었다. 중간에 풀면서 바뀌는 상태를 원형 큐로 관리할 수 있지않을까 생각도 해보았는데, 시간있을 때 도전해봐야겠다
#include<iostream>
#include <map>
#include <queue>
#include <string>
using namespace std;
int n,m,x,y,k,order;
int board[21][21];
int bottom = 5;
int dice[6] = {0,};
// 0 = 앞쪽
// 1 = 왼쪽
// 2 = 상단
// 3 = 오른쪽
// 4 = 뒤쪽
// 5 = 바닥
int tmp[6];
void reset(){
for(int z=0; z<6;z++){
tmp[z] = dice[z];
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n>>m>>x>>y>>k;
for(int i=0; i<n;i++){
for(int j=0; j<m;j++){
cin >> board[i][j];
}
}
for(int i=0;i<k;i++){
cin >> order;
if(order == 1){ // 동
if(y+1 < m){
y+=1; // 주사위 오른쪽으로 한칸 이동
if(board[x][y]==0){
board[x][y] = dice[3]; // 오른쪽으로 굴리면 오른쪽면이 바닥이 됨
}
else{
dice[3] = board[x][y];
board[x][y]=0;
}
cout << dice[1] << '\n';// 오른쪽으로 굴리면 왼쪽면이 상단이 됨
reset();
// 주사위 값 재설정
// 동쪽으로 굴리면 앞,뒤는 안바뀜
dice[1] = tmp[5]; // 원래 바닥이 왼쪽면이 됨
dice[2] = tmp[1];// 원래 왼쪽면이 상단이 됨
dice[3] = tmp[2]; // 원래 상단이 오른쪽면이 됨
dice[5] = tmp[3]; // 원래 오른쪽면이 바닥이 됨
}
}
else if(order==2){// 서
if(y-1 >=0){
y-=1; // 주사위 왼쪽으로 한칸 이동
if(board[x][y]==0){
board[x][y] = dice[1]; // 왼쪽으로 굴리면 왼쪽면이 바닥이 됨
}
else{
dice[1] = board[x][y];
board[x][y]=0;
}
cout << dice[3] << '\n';// 왼쪽으로 굴리면 오른쪽면이 상단이 됨
reset();
// 주사위 값 재설정
// 서쪽으로 굴리면 앞,뒤는 안바뀜
dice[3] = tmp[5]; // 원래 바닥이 오른쪽면이 됨
dice[5] = tmp[1];// 원래 왼쪽면이 바닥이 됨
dice[1] = tmp[2]; // 원래 상단이 왼쪽면이 됨
dice[2] = tmp[3]; // 원래 오른쪽면이 상단이 됨
}
}
else if(order==4){//남
if(x+1 < n){
x+=1; // 주사위 아래쪽으로 한칸 이동
if(board[x][y]==0){
board[x][y] = dice[4]; // 아래쪽으로 굴리면 뒤쪽면이 바닥이 됨
}
else{
dice[4] = board[x][y];
board[x][y]=0;
}
cout << dice[0] << '\n';// 아래쪽으로 굴리면 앞쪽면이 상단이 됨
reset();
// 주사위 값 재설정
// 남쪽으로 굴리면 왼,오는 안바뀜
dice[0] = tmp[5]; // 원래 바닥이 앞쪽이 됨
dice[2] = tmp[0];// 원래 앞면이 상단이 됨
dice[4] = tmp[2]; // 원래 상단이 뒤쪽면이 됨
dice[5] = tmp[4]; // 원래 뒤쪽면이 바닥이 됨
}
}
else{ // order==3 북
if(x-1 >=0){
x-=1; // 주사위 위쪽으로 한칸 이동
if(board[x][y]==0){
board[x][y] = dice[0]; // 위쪽으로 굴리면 앞쪽면이 바닥이 됨
}
else{
dice[0] = board[x][y];
board[x][y]=0;
}
cout << dice[4] << '\n';// 위쪽으로 굴리면 뒤쪽면이 상단이 됨
reset();
// 주사위 값 재설정
// 북쪽으로 굴리면 좌,우는 안바뀜
dice[4] = tmp[5]; // 원래 바닥이 뒤면이 됨
dice[5] = tmp[0];// 원래 앞면이 바닥이 됨
dice[0] = tmp[2]; // 원래 상단이 앞면이 됨
dice[2] = tmp[4]; // 원래 뒤쪽면이 상단이 됨
}
}
}
return 0;
}
728x90
'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
[백준/C++] 1371번 가장 많은 글자 (0) | 2022.09.25 |
---|---|
[백준/C++] 3197번 백조의 호수 (0) | 2022.09.23 |
백준 1107번 리모컨 <브루트포스> (0) | 2022.07.12 |
다익스트라 백준 1238번 파티 (0) | 2022.07.12 |
시뮬레이션 BOJ 3190번 (0) | 2022.07.12 |