• BOJ 3190 뱀 / C++

    2022. 7. 26.

    by. 내이름은 킹햄찌

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

     

    3190번: 뱀

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

    www.acmicpc.net

     

    백준 온라인저지 3190번 뱀문제입니다.

     

    아이디어

    시뮬레이션 문제인만큼 snake 클래스로 대부분의 로직을 처리했습니다. 큰 어려움은 없었고 풀이에 대한 설명은 주석을 통해 이해할 수 있을거라고 판단됩니다.

     

    #include<iostream>
    #include<queue>
    #include<vector>
    
    using namespace std;
    
    enum {
    	none = 0,
    	apple = 1,
    	snake = 2
    };
    
    class point {
    public :
    	int y;
    	int x;
    	int dirc;
    	point(int a, int b, int c) {
    		x = a;
    		y = b;
    		dirc = c;
    	}
    };
    
    // 오른쪽, 아래, 왼쪽, 위
    int mx[4] = { 1,0,-1,0 };
    int my[4] = { 0,1,0,-1 };
    
    vector<point> snakes;
    vector<vector<int>> field;
    queue<pair<int, char>> order;
    
    int N, K, L, X;
    char C;
    
    vector<vector<int>> setField(int n) {
    	return vector<vector<int>>(n+1, vector<int>(n+1, 0));
    }
    
    void input() {
    	cin >> N;
    	field = setField(N);
    	cin >> K;
    	int x, y;
    	for(int i=0;i<K;i++){
    		cin >> y >> x;
    		field[x][y] = apple;
    	}
    	cin >> L;
    	for(int i=0;i<L;i++){
    		cin >> X;
    		cin >> C;
    		order.push({ X,C });
    	}
    }
    
    void solution() {
    	int time = 0;
    	
    	snakes.push_back(point(1, 1, 0));
    	field[1][1] = snake;
    	while (snakes.size()) {
    
    		//방향이 바뀔때
    		if (order.size() != 0 && time == order.front().first) {
    
    			//오른쪽
    			if (order.front().second == 'D') {
    				snakes[0].dirc = snakes[0].dirc != 3 ? snakes[0].dirc + 1 : 0;
    			}
    			//왼쪽
    			else {
    				snakes[0].dirc = snakes[0].dirc != 0 ? snakes[0].dirc - 1 : 3;
    			}
    			order.pop();
    		}
    
    		time++;
    		
    		//뱀이 움직이는 로직
    		
    		point p = snakes[0];
    		
    
    		//벽에 머리를 박음
    		if (p.x + mx[p.dirc] > N || p.x + mx[p.dirc] <= 0 || p.y + my[p.dirc] > N || p.y + my[p.dirc] <= 0) {
    			cout << time;
    			return;
    		}
    
    		//몸통에 머리를 박음
    		if (field[p.x + mx[p.dirc]][p.y + my[p.dirc]] == snake) {
    			cout << time;
    			return;
    		}
    
    		//사과 먹을때
    		if (field[p.x + mx[p.dirc]][p.y + my[p.dirc]] == apple) {
    			field[p.x + mx[p.dirc]][p.y + my[p.dirc]] = snake;
    			snakes.insert(snakes.begin(),point(p.x + mx[p.dirc], p.y + my[p.dirc], snakes[0].dirc));
    			continue;
    		}
    		
    
    		//지나갈수 있을때
    		//몸통이 없다면
    		if (snakes.size() == 1) {
    			field[p.x][p.y] = none;
    			field[p.x + mx[p.dirc]][p.y + my[p.dirc]] = snake;
    			snakes.push_back(point(p.x + mx[p.dirc], p.y + my[p.dirc], snakes[0].dirc));
    			snakes.erase(snakes.begin());
    			
    		}
    		//몸통이 있다면
    		else {
    			field[p.x + mx[p.dirc]][p.y + my[p.dirc]] = snake;
    			field[snakes[snakes.size()-1].x][snakes[snakes.size() - 1].y] = none;
    			snakes.insert(snakes.begin(), point(p.x + mx[p.dirc], p.y + my[p.dirc], snakes[0].dirc));
    			snakes.erase(snakes.end()-1);
    		}
    		
    	}
    }
    
    int main(void) {
    	input();
    	solution();
    }

     

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

    BOJ 2933 미네랄 / C++  (0) 2022.07.26
    BOJ 1966 프린터 큐 / C++  (0) 2022.07.26
    BOJ 14499 주사위 굴리기 / C++  (0) 2022.07.26
    BOJ 13460 구슬 탈출 2 / C++  (0) 2022.07.26
    BOJ 15591 MooTube / C++  (0) 2022.05.24

    댓글