Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

대웅짱님의 블로그

[14499] 주사위 굴리기 본문

알고리즘/BOJ

[14499] 주사위 굴리기

대웅짱 2019. 2. 9. 18:00

문제: https://www.acmicpc.net/problem/14499



주사위 굴리기.


지도 위에서 주사위 굴리는 것을 시뮬레이션 하는 문제이다.


룰은 이렇다.


주사위를 동 서 남 북으로 굴릴 수 있으며


주사위는 처음에 여섯 면 모두 0이라는 숫자를 가지고 시작한다.


만약 굴린 주사위의 위치에 지도의 숫자가 0이 아니라면 숫자가 주사위 바닥 면에 스며들고


지도의 숫자는 0이된다.


굴린 주사위의 위치에 지도의 숫자가 0이라면 주사위의 바닥 면의 숫자가 지도위에 복사된다.


이렇게 주사위를 굴릴 때 마다 위에서 봤을 때 보이는 주사위의 숫자(상단 면)를 출력하는 문제이다.


만약 주사위를 굴릴 때 지도 밖으로 벗어나는 명령이 있을 경우에는 이 명령을 무시한다.



문제에서 요구하는 것은 그렇게 어렵지 않다. 


이 문제에서 중요한 점은 주사위의 상태를 얼마나 잘 가지고 갈 수 있냐 이다.


굴리기 행위를 할 때 마다 주사위의 상태가 계속해서 바뀌기 때문이다.


나는 dice라는 배열을 만들어 주사위의 상태를 저장하게 했다.


사실 좀 더 좋은 아이디어가 있을 것 같지만 당장 생각이 나지 않아서


손으로 그려본 후 원래의 주사위 상태에서 동 서 남 북으로 굴렸을 때의 주사위 상태를 보고


계속해서 갱신해주는 방식으로 코드를 작성했다.


예를들어 


   2

4 1 3

   5

   6


이런 전개도를 가진 주사위를 동쪽으로 굴렸을 경우


   2

1 3 6

   5

   4


가 된다.


1 -> 3 

2 -> 2

3 -> 6

4 -> 1

5 -> 5

6 -> 4


로 바닥 면이 바뀌게 된다.


이렇게 굴렸을 때 변하지 않는 두 면을 제외하고 나머지 네 면의 상태를 계속해서 바꿔주는 방식으로


코드를 작성했다.


이 문제 제출하면서 두 번 틀렸는데


1. 동서남북 순서가 아니라 동서북남 순서인 것.


2. 세로는 n, 가로는 m 범위인데 가로의 범위도 n으로 잡은 것.


앞으론 문제를 잘 읽고 꼼꼼하게 풀어야 겠다.


끝.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int arr[22][22];
int n, m, x, y, k;
int dx[5= {000-11};
int dy[5= {01-100};
int dice[7= {0000000}, temp[7];
int convertA[5][4= {{0000}, {1346}, {1346}, {1 ,256}, {1256}};
int convertB[5][4= {{0000}, {3614}, {4163}, {2615}, {5162}};
int main(){
    scanf("%d %d %d %d %d"&n, &m, &x, &y, &k);
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            scanf("%d"&arr[i][j]);
        }
    }
    int d;
    for(int i=0; i<k; i++){
        scanf("%d"&d);
        if(x+dx[d] < 0 || x+dx[d] >= n || y+dy[d] < 0 || y+dy[d] >= m) continue;
        x+=dx[d];
        y+=dy[d];
        //dice change
        memcpy(temp, dice, sizeof(dice));
        for(int i=0; i<4; i++){
            dice[convertA[d][i]] = temp[convertB[d][i]];
        }
 
        if(!arr[x][y]){
            arr[x][y] = dice[1];
        }else{
            dice[1= arr[x][y];
            arr[x][y] = 0;
        }
        printf("%d\n", dice[6]);
 
    }
    return 0;
}
cs


'알고리즘 > BOJ' 카테고리의 다른 글

[14501] 퇴사  (0) 2019.02.13
[14500] 테트로미노  (0) 2019.02.12
[13458] 시험 감독  (0) 2019.02.09
[3190] 뱀  (0) 2019.02.08
[12100] 2048 (Easy)  (0) 2019.02.07