본문 바로가기
알고리즘/BOJ

BOJ 3190 ) 뱀 (C++)

by twinkite 2022. 6. 16.
반응형
 

3190번: 뱀

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

www.acmicpc.net

 큐에 뱀의 몸 좌표를 넣어주고 이동마다 머리와 꼬리를 관리해준다. 처음에 접근을 잘못해서 매 이동마다 큐 내부의 모든 몸의 좌표를 이동시켜주려고 하다가 포기했었는데 생각해보니 머리와 꼬리만 관리해줘도 상관없겠다는 결론에 이르렀다. 

 dir이라는 변수를 두고 왼쪽 회전인 경우 -1, 오른쪽으로 회전인 경우 +1을 해줌으로써 방향 관리를 해주고 cnt와 routeidx로 해당 회차에 방향 이동이 일어나는지를 관리해줬다. 매 이동에서 다음 좌표에 과일이 있으면 좌표를 큐에 넣어줌으로써 뱀의 길이를 증가시키고, 과일이 없는 경우 머리 좌표를 넣고 꼬리 좌표를 하나 삭제해준다. 

 

#include <iostream>
#include <queue>
#define pii pair<int,int>
#define x first
#define y second
using namespace std;
int dx[4]={0,1,0,-1};   // 오른쪽. 아래, 왼쪽, 위
int dy[4]={1,0,-1,0};
int N, K, r, c, L, X,C;
deque<pii> q;
int arr[102][102];
pair<int, char> route[101];
int t=0;

int main(){
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);

    cin>>N>>K;
    for(int i=0;i<K;i++){
        cin>>r>>c;
        arr[r][c]=1; // 과일 위치
    }

    q.push_back({1,1});
    arr[1][1]=-1;
    cin>>L;
    for(int i=0;i<L;i++){
        cin>>route[i].x>>route[i].y;
    }
    int cnt =0, dir=0, routeidx=0;
    bool fin = false;
    
    while(1){
        int curx = q.front().x;
        int cury = q.front().y;
       // cout<<curx<<' '<<cury<<' '<<route[routeidx].x<<' '<<cnt<<'\n';
        if(route[routeidx].x==cnt){
            if(route[routeidx].y=='L'){
                dir = (dir+3)%4;
            } else {
                dir = (dir+1)%4;
            }
            routeidx++;
        }
        int nx = curx+dx[dir];
        int ny = cury+dy[dir];
        if(nx<=0||ny<=0||nx>N||ny>N) break;
        if(arr[nx][ny]<0) break;
        if(arr[nx][ny]>0) {
            arr[nx][ny]=-1;
            q.push_front({nx,ny});
        } else {
            arr[nx][ny]=-1;
            q.push_front({nx, ny});
            int tempx = q.back().x;
            int tempy = q.back().y;
            q.pop_back();
            arr[tempx][tempy]=0;
        }
        cnt++;
    }

    cout<<cnt+1;
    return 0;
}
반응형

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

BOJ 15738 ) 뒤집기 (C++)  (0) 2022.06.20
BOJ 15705 ) 단어 찾기 (C++)  (0) 2022.06.19
BOJ 5921 ) Escaping the Farm (C++)  (0) 2022.06.13
BOJ 18877 ) Social Distancing (C++)  (0) 2022.06.10
BOJ 2428 ) 표절 (C++)  (0) 2022.06.09