BOJ3190::뱀


*map[x][y] == 0 : 일반땅

              == 2 : 사과

              == 1 : 뱀


1. 방향에대한 정보를 dir 에 저장하고 방향전환함수 turn을 만들어, 주어진 시간에 대해 방향전환이 필요할 경우 방향전환 시킴


2. 방향에 따라 x,y값 변화 시킴


3. 이동할 곳이 벽이거나 몸통인경우 종료


4. 이동할 곳이 일반땅인 경우 뱀의 꼬리부분 삭제


5. 뱀의 머리부분 추가 및 맵에 갱신


6. 종료시까지 반복



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
#include <iostream>
#include <queue>
#include <vector>
#define P pair<int,int>
using namespace std;
 
int n, k, l, dir;
int map[102][102];
int dx[] = { -1,0,1,0 };
int dy[] = { 0,1,0,-1 };
vector<P> snake;
 
//0북 1동 2남 3서
void turn(int c) {
    if (c == 'L') {
        dir = (dir - 1 < 0) ? 3 : dir - 1;
    }
    else {
        dir = (dir + 1 > 3) ? 0 : dir + 1;
    }
}
 
//디버깅용
void printAll() {
    cout << endl;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cout << map[i][j] << " ";
        }
        cout << endl;
    }
}
 
int main() {
    cin >> n >> k;
    while (k--) {
        int r, c;
        cin >> r >> c;
        map[r][c] = 2;
    }
 
    cin >> l;
    queue<P> q;
    while (l--) {
        int d;
        char c;
        cin >> d >> c;
        q.push(P(d, c));
    }
 
    map[1][1= 1;
    snake.push_back(P(11));
    dir = 1;
 
    int time = 0;
    while (true) {
        //time확인하고 방향전환
        if (!q.empty()) {
            if (q.front().first == time) {
                turn(q.front().second);
                q.pop();
            }
        }
        //time 증가
        time++;
 
        //다음지점 좌표
        int ax = snake[snake.size() - 1].first + dx[dir];
        int ay = snake[snake.size() - 1].second + dy[dir];
 
        //벽에 부딪히거나 몸통에 부딪히면 종료
        if (ax<1 || ay < 1 || ax>|| ay>n) break;
        if (map[ax][ay] == 1break;
        
        //다음지점이 일반땅이면
        if (map[ax][ay] != 2) {
            //map에서 꼬리부분 삭제
            //벡터에서 꼬리부분 삭제
            map[snake[0].first][snake[0].second] = 0;
            snake.erase(snake.begin());
        }
 
        //벡터에 머리부분 추가
        //맵에 머리부분 추가
        snake.push_back(P(ax, ay));
        map[ax][ay] = 1;
    }
 
    cout << time << endl;
}
cs


'BOJ::문제풀이' 카테고리의 다른 글

9663 N-Queen  (0) 2018.02.24
1949 우수마을  (1) 2018.02.23
14612 김식당  (0) 2018.02.17
2468 안전영역  (0) 2018.02.17
2629 양팔저울  (0) 2018.02.14

+ Recent posts