BOJ 3190 뱀

대학교 동기들이 물어봐서 다시 한 번 풀어봤습니다.

문제에서 요구하는데로 그대로 따라하면 해결할 수 있습니다.

저는 map에서 0은 빈 공간, 1은 뱀을 나타내는 값, 2는 사과를 저장합니다.

turnInfo에는 문제에서 주어지는 L의 값들을 구조체로 저장했습니다.

나머지는 주석을 달아놓았습니다.

궁금한 점은 댓글달아주세요^^

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <iostream>
#include <queue>
 
#define MAX_SIZE 100
#define mp make_pair
 
using namespace std;
 
typedef pair<intint> pii;
typedef struct {
    int sec;
    int dir;
}TurnInfo;
 
 
int n; //보드 크기
int map[MAX_SIZE][MAX_SIZE]; // 사과는 2, 뱀은 1, 맵은 0
TurnInfo turnInfo[MAX_SIZE];
int dx[4= { -1100 };
int dy[4= { 00-11 };
 
//오른쪽 : 위 -> 오, 아래 -> 왼, 오 -> 아, 왼 -> 위
//왼쪽 : 위 -> 왼, 아래 -> 오른, 오 -> 위, 왼 -> 아
 
//r : 0 -> 3, 1 -> 2, 3 -> 1, 2 -> 0
//l : 0 -> 2, 1 -> 3, 3 -> 0, 2 -> 1
 
int turn(int now, int next)
{
    if (next == 0// 왼쪽
    {
        if (now == 0 || now == 1return (now + 2) % 4;
        else return 3 - now;
    }
    else // 오른쪽
    {
        if (now == 0 || now == 1return 3 - now;
        else return (now + 2) % 4;
    }
}
 
bool isDead(pii headPos) {
    //벽을 박았는지
    if (headPos.first < 0 || headPos.second < 0 || headPos.first >= n || headPos.second >= n) {
        return 1;
    }
    //내 몸을 부딪혔는지?
    else if (map[headPos.first][headPos.second] == 1) {
        return 1;
    }
 
    //위에 속하지 않으면 살았다.
    return 0;
}
 
int main() {
    cin >> n;
 
    //사과 개수
    int k;
    cin >> k;
 
    //사과를 2로 맵에 표시
    for (int i = 0; i < k; i++) {
        int x, y;
        cin >> x >> y;
        map[x - 1][y - 1= 2;
    }
 
 
    //방향 변환 개수
    int l;
    cin >> l;
 
    //방향 변환 x는 시간 c는 방향
    for (int i = 0; i < l; i++) {
        int x;
        char c;
        cin >> x >> c;
 
        turnInfo[i].sec = x;
 
        if (c == 'L') {
            turnInfo[i].dir = 0;
        }
        else {
            turnInfo[i].dir = 1;
        }
    }
 
    //위에까지 인풋
    
    queue<pii> snakeTrace; // 뱀 자취
    int sec = 0// 현재 시간은 0
    int snakeDir = 3// 초기 방향 오른쪽
 
    pii headPos;//머리 위치
    headPos.first = headPos.second = 0// 뱀 머리 위치 0, 0으로
 
    //turnInfo 인덱스
    int turnInfoIdx = 0;
 
    //뱀이 죽지않으면 루프
    while (!isDead(headPos)) {
        //현재시간이 0이 아닌데 map이 0이면 꼬리가 잘려야함
        //맵은 0이면 빈공간, 1이면 뱀의 몸, 2이면 사과
        //sec != 0 이 조건은 시작점은 무조건 map이 0이기 때문에 시작하자마자 꼬리가 잘릴 순 없음
        if (sec != 0 && map[headPos.first][headPos.second] == 0) {    
            map[snakeTrace.front().first][snakeTrace.front().second] = 0;//꼬리의 map을 빈공간으로 만들어줌 즉, 잘라버림
            snakeTrace.pop();//내 몸을 보관하고 있는 큐에서 꼬리를 버림
        }
 
        //머리가 위치한 곳의 맵을 1로만들어줌
        map[headPos.first][headPos.second] = 1;
        snakeTrace.push(headPos);//뱀의 머리를 넣기
 
        //turnInfoIdx가 입력받은 l보다 작아야함 같거나 크다면 방향을 전환할 곳이 없으므로 가던곳으로 가야함
        if (turnInfoIdx < l) {
            if (sec == turnInfo[turnInfoIdx].sec) {//현재시간과 방향전환해야하는 시간이 같으면
                snakeDir = turn(snakeDir, turnInfo[turnInfoIdx].dir);//뱀의 방향을 전환해줌
                turnInfoIdx++;//턴정보 인덱스 증가
            }
        }
 
        //뱀의 머리를 다음 위치로 이동시킴
        headPos.first += dx[snakeDir];
        headPos.second += dy[snakeDir];
        sec++;    //시간증가
    }
 
    cout << sec;
 
    return 0;
}
cs


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

[2140] 지뢰찾기  (0) 2017.12.27
[12845] 모두의 마블  (0) 2017.08.26
[12841] 정보대 등산  (0) 2017.08.23
[1700] 멀티탭 스케줄링  (0) 2017.08.01
[1992] 쿼드 트리  (0) 2017.07.30

+ Recent posts