티스토리 뷰

PS/BOJ C++

3190번 - 뱀

zpqmdh 2022. 2. 22. 00:47

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

 

3190번: 뱀

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

www.acmicpc.net

#include <iostream>
#include <cstring>
#include <vector>
#include <deque>
using namespace std;
int N, K, L;
int Map[101][101]; //1: 사과, 2: 뱀
int dy[4] = {0, -1, 0, 1};
int dx[4] = {1, 0, -1, 0};
deque<pair<int ,int>> snake; //뱀의 머리와 꼬리 위치 저장
vector<pair<int, char>> V; //int 시간 후 char 방향으로 turn
int time = 0;
bool isPossible(int y, int x)
{
    if(y<1 || y>=N+1 || x<1 || x>=N+1)
        return false;
    return true;
}
int turnDirection(int x, char c)
{
    //왼쪽으로 90도 회전
    if(c == 'L')
    {
        if(x==0) return 1;
        else if(x==1) return 2;
        else if(x==2) return 3;
        else if(x==3) return 0;
    }
    //오른쪽으로 90도 회전
    else if(c == 'D')
    {
        if(x==0) return 3;
        else if(x==1) return 0;
        else if(x==2) return 1;
        else if(x==3) return 2;
    }

}
void solve()
{
    int y=1, x=1, i=0, idx=0;
    //뱀의 처음 위치 저장
    snake.push_back(make_pair(y, x));
    Map[y][x] = 2;

    while(true)
    {
        //뱀의 방향이 바뀌는 시간이 지난다면
        if(idx<V.size() && time == V[idx].first)
        {
            if(V[idx].second == 'L') i = turnDirection(i, 'L');
            else if(V[idx].second == 'D') i = turnDirection(i, 'D');
            idx++;
        }

        time++; //시간 증가

        int ny = y + dy[i];
        int nx = x + dx[i];
    
        //이동이 불가능하거나, 뱀의 몸통과 부딪힐 때
        if(false == isPossible(ny,nx) || 2 == Map[ny][nx])
        {
            break;
        }
        //사과가 없을 때 -> 머리 이동 & 꼬리 이동
        else if(0 == Map[ny][nx])
        {
            Map[ny][nx] = 2; //뱀의 위치 변경
            Map[snake.back().first][snake.back().second] = 0;
            snake.pop_back();
            snake.push_front(make_pair(ny, nx));
        }
        //사과가 있을 때 -> 머리 이동 && 꼬리 고정
        else if(1 == Map[ny][nx])
        {
            Map[ny][nx] = 2;
            snake.push_front(make_pair(ny,nx));
        }
        y = ny;
        x = nx;
    }
    cout << time << '\n';
    return ;

}
int main()
{
    int i, j; //for loop을 위한 변수

    cin >> N >> K;

    memset(Map, 0, sizeof((N+1)*(N+1))); //0으로 초기화

    //사과 위치 저장
    int y, x;
    for(i=1; i<=K; i++)
    {
        cin >> y >> x;
        Map[y][x] = 1;
    }

    cin >> L;

    //뱀의 방향이 변하는 <시간, 방향> 저장
    int X;
    char C;
    for(i=1; i<=L; i++)
    {
        cin >> X >> C;
        V.push_back(make_pair(X, C));
    }
    solve();
    return 0;
}

'PS > BOJ C++' 카테고리의 다른 글

16173번 - 점프왕 쩰리 (Small)  (0) 2022.03.20
11403번 - 경로 찾기  (0) 2022.02.27
1010번 - 다리 놓기  (0) 2022.02.20
1325번 - 효율적인 해킹  (0) 2022.02.13
10971번 - 외판원 순회 2  (0) 2022.02.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함