ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [3190] 뱀
    BOJ 2021. 11. 13. 17:00

    https://www.acmicpc.net/problem/3190

     

    3190번: 뱀

     'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

    www.acmicpc.net

    <문제>

    뱀이 지나간 경로를 전부 저장해둔다면

    ail의 위치는 뱀의 머리가 몇번째로 방문한 곳인지를 인덱스로 접근할 수 있다. 

    입력으로 들어오는 방향전환은 시간을 기준으로 오름차순 정렬되어 있으니 현재 턴과 비교하여

    왼쪽으로 90도, 오른쪽으로 90도씩 돌려주어야 한다. 항상 X초 이후에 처리해야 하는것에 유의해야한다.

    뱀이 존재하는 위치는 bool check[][]에 표시해주었고, 이를 통해 뱀의 머리와, 뱀의 몸의 충돌을 파악했다.

    그밖에 사과를 한번 방문하면 사과를 없애주어야 하는점도 주의해야한다.

     

    <소스코드>

    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
    #include <bits/stdc++.h>
    using namespace std;
    int a[101][101], dy[4= {010-1}, dx[4= {10-10}, n, k, l,
                     turn = 1, curY = 1, curX = 1, lastY = 1, lastX = 1, curDir,
                     tailIdx, Qidx;
    bool check[101][101];
    vector<pair<intint>> path;
    vector<pair<intchar>> query;
    int main(void) {
        cin >> n >> k;
        int i, j;
        for (i = 0; i < k; i++) {
            int y, x;
            cin >> y >> x;
            a[y][x] = 1;
        }
        cin >> l;
        for (i = 0; i < l; i++) {
            int x;
            char c;
            cin >> x >> c;
            query.push_back({x, c});
        }
        check[1][1= true;
        path.push_back({11});
        while (1) {
            int nextY = curY + dy[curDir];
            int nextX = curX + dx[curDir];
            if (nextY < 1 || nextX < 1 || nextY > n || nextX > n ||
                check[nextY][nextX])
                break;
            path.push_back({nextY, nextX});
            check[nextY][nextX] = true;
            if (a[nextY][nextX] == 1) {
                a[nextY][nextX] = 0;
            } else {
                check[lastY][lastX] = false;
                tailIdx++;
                lastY = path[tailIdx].first;
                lastX = path[tailIdx].second;
            }
            curY = nextY;
            curX = nextX;
            if (Qidx < l && query[Qidx].first == turn) {
                char nDir = query[Qidx].second;
                if (nDir == 'L') {
                    curDir--;
                    if (curDir == -1) curDir = 3;
                } else if (nDir == 'D') {
                    curDir++;
                    if (curDir == 4) curDir = 0;
                }
                Qidx++;
            }
            turn++;
        }
        cout << turn;
        return 0;
    }
    cs

     

    'BOJ' 카테고리의 다른 글

    [2424] 부산의 해적  (0) 2021.11.17
    [2138] 전구와 스위치  (0) 2021.11.16
    [1011] Fly me to the Alpha Centauri  (0) 2021.11.12
    [1182] 부분수열의 합  (0) 2021.11.10
    [17503] 맥주 축제  (0) 2021.11.10

    댓글