본문 바로가기

Problem Solving/백준

[백준] 14499번: 주사위 굴리기

내가 짠 코드

#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
// N * M 인 지도
//지도 좌표(r, c) r: 북쪽으로부터, c : 서쪽으로부터
/*r
  r
  r
  r
  rccccc

*/
//1 동쪽 2 서쪽 3 북쪽 4 남쪽
//  0,1  0,-1  -1,0  1,0
//  ->    <-     ^    V
/* 배열에 저장하는 순서, 2가 윗면, 3이 오른쪽
    0
  1 2 3
    4
    5
동쪽으로 이동시    서쪽으로 이동시    북쪽으로 이동시    남쪽으로 이동시
    0              0               2             5
  5 1 2          2 3 5           1 4 3         1 0 3
    4              4               5             2
    3              1               0             4
 
  051243         023541          214350        510324
*/
int main(void){
    int N, M, x, y, stage;
    /*
    x
    x
    x
    xyyyyyy
    */
    scanf("%d %d %d %d %d",&N, &M, &x, &y, &stage);
    int i, j, value;
    int dice[6]={0,}, new_dice[6]={0,};
    int dice_arrangement[4][6]={{0,5,1,2,4,3},{0,2,3,5,4,1},{2,1,4,3,5,0},{5,1,0,3,2,4}};
    int movement[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
    vector<vector< int > > dice_map(N);
    
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            scanf("%d",&value);
            dice_map[i].push_back(value);
        }        
    }

    for(i=0;i<stage;i++){
        scanf("%d",&value);
        value = value -1;
        if(x+movement[value][0]>=0 && x+movement[value][0]<N && y+movement[value][1] >=0 && y+movement[value][1] < M){ // 지도 밖을 안 벗어나는 경우에만
            x = x+movement[value][0];
            y = y+movement[value][1];
            
            // cout << "moved stage : " << i+1 << "(x,y)" << "(" << x << "," << y << ")" << endl; 
            for(j=0;j<6;j++){ //주사위 업데이트
                new_dice[j] = dice[dice_arrangement[value][j]];
            }

            for(j=0;j<6;j++) { //업데이트 된 값 적용
                dice[j] = new_dice[j];
            }
            


            
            if(dice_map[x][y] == 0){ //이동한 칸에 쓰여 있는 수가 0이면
                dice_map[x][y] = dice[5]; //주사위의 바닥면에 쓰여있는 수가 칸에 복사
            }
            else{ //이동한 칸에 쓰여 있는 수가 0이 아니면
                dice[5] = dice_map[x][y]; //칸에 쓰여 있는 수가 주사위의 바닥면으로 복사
                dice_map[x][y] = 0; //칸에 있는 수는 0 이 된다.
            }

            cout << dice[2] << endl;
        }
        else continue;
    }
    
    return 0;
}


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

 

'Problem Solving > 백준' 카테고리의 다른 글

[백준] 1009: 분산처리  (0) 2021.02.19
[백준] 1032: 명령 프롬프트  (0) 2021.02.19
[백준] 1026번: 보물  (0) 2021.02.19
[백준] 14503번: 로봇 청소기  (0) 2021.02.01
[백준] 14891번: 톱니바퀴  (0) 2021.02.01