백준 3190 - 뱀

구현문제를 많이 안풀어 봐서 아직 감이 잘 안잡힌다
하나 배운점은 문제조건을 꼼꼼히 잘 생각해봐야 한다는 것과
특수한 상황에 대한 판단을 계속해서 해줘야 할 것 같다.
(이문제에서 사과를 먹으면 사과가 없어진다는 점을 놓쳐서 시간이 좀 소모됐다...)

#include<iostream>
#include<queue>
#include<deque>
#include<vector>

using namespace std;

int main(){
    // 벽 또는 자기 자신과 부딪히면 게임 끝
    int ar[100][100];
    int N;
    cin>>N;
    int K;
    cin>>K;
    for(int i=0;i<100;i++){
        fill_n(ar[i],100,0);
    }
    int a,b;
    for(int i=0;i<K;i++){
        cin>>a>>b;
        ar[a-1][b-1]=-1;
    }
    queue<pair<int,int>> q;
    cin>>a;
    int e;char d;
    // 왼쪽0 오른쪽 1
    for(int i=0;i<a;i++){
        cin>>e>>d;
        if(d=='D'){
            q.push({e,1});
        }else{
            q.push({e,0});
        }
    }
    int time=0;
    int X=0;int Y=0;
    pair<int,int> dd={1,0};
    deque<pair<int,int>> track;
    track.push_back({X,Y});
    while(true){
        int n=q.front().first;
        int nx=X+dd.first;
        int ny=Y+dd.second;
        
        for(int i=0;i<track.size();i++){
            if(track[i].first==nx&&track[i].second==ny){
                cout<<time+1<<endl;
                return 0;
                break;
            }
        }
        if(nx<0||nx>=N||ny<0||ny>=N){
            
            break;
        }

        if(ar[ny][nx]==-1){
            track.push_front({nx,ny});
            ar[ny][nx]=0;
            X=nx;Y=ny;
        }else{
            track.push_front({nx,ny});
            track.pop_back();
            X=nx;Y=ny;
        }
        time+=1;
        if(time==n){
            int idx;
            if(!q.empty()){
            idx=q.front().second;
            }
            q.pop();
            if(dd.first==1&&dd.second==0){
                if(idx==0){
                    dd={0,-1};
                }else{
                    dd={0,1};
                }
            }else if(dd.first==0&&dd.second==1){
                if(idx==0){
                    dd={1,0};
                }else{
                    dd={-1,0};
                }
            }else if(dd.first==-1&&dd.second==0){
                
                if(idx==0){
                    dd={0,1};
                }else{
                    dd={0,-1};
                }
            }else if(dd.first==0&&dd.second==-1){
                if(idx==0){
                    dd={-1,0};
                }else{
                    dd={1,0};
                }
            }
        }
    }
    
    cout<<time+1;
}

좋은 웹페이지 즐겨찾기