문제풀이(Problem Solving)

백준, BOJ, 3190번, 뱀 : C++ [CPP]

게임이 더 좋아 2021. 12. 8. 14:52
반응형
728x170

 

문제대로 구현하면 된다.

하지만 어렵지는 않았다.

그냥.. 중간에 if 조건문에서 == 써야할 것을 =으로 써서 30분 날렸다.

 

 

 

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


 

# 맞는 풀이

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

#define X first
#define Y second

using namespace std;

//하 상 우 좌 -> 좌측 위 기준
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };




int N, K, L;

int map[100][100];
char direction[10001];


queue <pair<int, int>> q; //꼬리 잘라내기
//1.머리를 hx,hy로 옮김, 게임시간 cnt
int Move(int hx, int hy, int px, int py, int cnt) {
    //종료조건 -> 몸에 부딪히거나 벽에 박으면 종료
    if (hx < 0 || hx >= N || hy < 0 || hy >= N || map[hx][hy] == 1) {
        return cnt;
    }

    //첫 노드는 확인하지 않음
    if (cnt != 0) {
        //2. 해당 칸에 사과가 있는지 없는지 확인
        if (map[hx][hy] == 2) {
            //사과가 있으면 먹고 1로 바꿈
            q.push({ hx,hy });
            map[hx][hy] = 1;

        }
        //사과가 없으면
        else {

            q.push({ hx,hy });
            map[hx][hy] = 1;
            auto tail = q.front();
            q.pop();
            map[tail.X][tail.Y] = 0; //꼬리는 0으로 바꿈. 

        }
    }
    else {
        map[hx][hy] = 1;
    }
    
    

    //3.꼬리에 대한 처리 후 cnt를 높여야함.

    //4. 다음 머리를 옮길 위치 지정
    int dirX = hx - px;
    int dirY = hy - py;
    //머리를 옮김 ->  머리의 방향을 바꿔야할 경우
    int nx, ny; //다음 갈 곳
    nx = 0;
    ny = 0;

    //좌측으로 머리를 꺾음
    if (direction[cnt] == 'L') {
        //현재 방향이 아래쪽
        if (dirX == dx[0] && dirY == dy[0]) {
            nx = hx;
            ny = hy + 1;
        }//현재 방향이 위쪽
        else if (dirX == dx[1] && dirY == dy[1]) {
            nx = hx;
            ny = hy - 1;
        }//현재 방향이 오른
        else if (dirX == dx[2] && dirY == dy[2]) {
            nx = hx - 1;
            ny = hy;
        }//현재 방향이 왼
        else if (dirX == dx[3] && dirY == dy[3]) {
            nx = hx + 1;
            ny = hy;
        }
        //cout << "머리 왼쪽으로 꺾음" << '\n';
    }//머리를 오른쪽으로 꺾음
    else if (direction[cnt] == 'D') {
        //현재 방향이 아래쪽
        if (dirX == dx[0] && dirY == dy[0]) {
            nx = hx;
            ny = hy - 1;
        }//현재 방향이 위쪽
        else if (dirX == dx[1] && dirY == dy[1]) {
            nx = hx;
            ny = hy + 1;
        }//현재 방향이 오른
        else if (dirX == dx[2] && dirY == dy[2]) {
            nx = hx + 1;
            ny = hy;
        }//현재 방향이 왼
        else if (dirX == dx[3] && dirY == dy[3]) {
            nx = hx - 1;
            ny = hy;
        }
        //cout << "머리 오른쪽으로 꺾음" << '\n';

    }
    //머리를 꺾지 않음
    else{
        nx = hx + dirX;
        ny = hy + dirY;
    }


    /* -> 진행상황 프린트 함수
    * for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cout << map[i][j];
        }
        cout << '\n';
    }
    cout << "///////////////////////////////////" << '\n';
    */
    
    return Move(nx, ny, hx, hy, cnt + 1);

}


int main() {

    cin >> N >> K;
    while (K--) {
        int x, y;
        cin >> x >> y;
        map[x - 1][y - 1] = 2;
    }
    cin >> L;
    while (L--) {
        int x;
        char c;
        cin >> x >> c;
        direction[x] = c;
    }
    q.push({ 0,0 });
    int ans = Move(0, 0, 0, -1, 0); //처음엔 오른쪽으로 시작함.
    cout << ans;
}

 

if 조건문에는 =가 들어가는 것을 경계하라..

30분 날렸다.

 

728x90
반응형
그리드형