본문 바로가기

baekjoon

14499번 주사위 굴리기

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

구현 문제이다. 나 같은 경우는 아래와 같이 풀었다.

1. (북·남), (서·동)으로 움직일 때 양옆은 생각 안 해도 된다.
2. (북·남) 움직일 때의 함수 하나 만들고 (서·동) 움직일 때 함수를 따로 만들어 준다.
3. 북 또는 남으로 움직일 때 x 좌푯값을 갱신해주고 x가 board를 초과하면 주사위를 굴리지 않는다.
4. 서 또는 동으로 움직일 때 y 좌푯값을 갱신해주고 y가 board를 초과하면 주사위를 굴리지 않는다.
5. x, y 둘 다 board를 초과하지 않는다면 주사위를 굴리고 조건대로 값을 넣는다.

#include <bits/stdc++.h>
#define l long long
#define INF 2e9
#define p pair<int,int>
#define vc vector<int>
#define F first
#define S second
using namespace std;

int dice[4][3],board[21][21],x,y,n,m;

bool UpDownMove(int move){
    int UD = 1;
    if(move == 3) UD *= -1;

    if(x + UD < 0 || x + UD >= n) return false;
    x += UD;

    int temp = dice[3][1];

    if(UD < 0){
        dice[3][1] = dice[0][1];
        dice[0][1] = dice[1][1];
        dice[1][1] = dice[2][1];
        dice[2][1] = temp;
    }
    else{
        dice[3][1] = dice[2][1];
        dice[2][1] = dice[1][1];
        dice[1][1] = dice[0][1];
        dice[0][1] = temp;
    }
    if(board[x][y] != 0){
        dice[3][1] = board[x][y];
        board[x][y] = 0;
    }
    else if(board[x][y] == 0) board[x][y] = dice[3][1];

    return true;
}

bool LeftRightMove(int move){
    int LR = 1;
    if(move == 2) LR *= -1;

    if(y + LR < 0 || y + LR >= m) return false;
    y += LR;

    int temp = dice[3][1];

    if(LR < 0){
        dice[3][1] = dice[1][0];
        dice[1][0] = dice[1][1];
        dice[1][1] = dice[1][2];
        dice[1][2] = temp;
    }
    else{
        dice[3][1] = dice[1][2];
        dice[1][2] = dice[1][1];
        dice[1][1] = dice[1][0];
        dice[1][0] = temp;
    }

    if(board[x][y] != 0){
        dice[3][1] = board[x][y];
        board[x][y] = 0;
    }
    else if(board[x][y] == 0) board[x][y] = dice[3][1];

    return true;
}

int main() {
    ios_base::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);

    int k,move;

    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++){
        bool check = true;
        cin >> move;

        if(move == 3 || move == 4) check = UpDownMove(move);
        else check = LeftRightMove(move);
        if(check) cout << dice[1][1] << "\n";
    }
}



'baekjoon' 카테고리의 다른 글

15684번 사다리 조작  (0) 2022.04.03
15685번 드래곤 커브  (0) 2022.04.01
7662번 이중 우선순위 큐  (0) 2022.03.29
17404번 RGB거리 2  (0) 2022.03.27
2887번 행성 터널  (0) 2022.03.27