본문 바로가기
BaekJoon/C++

3055 : 탈출 (C++)

by GrayChoi 2021. 3. 3.
반응형

 

3055번: 탈출

사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제

www.acmicpc.net


푸는데 너무 오래걸렸다.

#include<iostream>
#include<string>
#include<queue>

using namespace std;

char map[50][50];
bool visit[50][50];
int result[50][50];

queue<pair<int, int>> q;

int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

int R, C;

int xS, yS; // 임시 저장공간 큐의 맨 뒤에 S를 넣기 위함
int xR, yR; // 결과값을 위한 임시 저장 공간 결과를 출력할 때 사용

void bfs() {
    int x, y;

    while(!q.empty()) {
        x = q.front().first;
        y = q.front().second;
        q.pop();

        for(int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx >= 0 && nx < R && ny >= 0 && ny < C) {
                if(map[x][y] == '*') {
                    // 물이 있는 칸인 경우
                    if(visit[nx][ny] == false && map[nx][ny] != 'D') {
                        map[nx][ny] = '*';
                        visit[nx][ny] = true;
                        q.push({nx, ny});
                    }
                } else {
                    // 고슴도치가 이동한 칸인 경우
                    if(visit[nx][ny] == false) {
                        map[nx][ny] = 'S';
                        result[nx][ny] = result[x][y] + 1;
                        visit[nx][ny] = true;
                        q.push({nx,ny});
                    }
                }
            }
        }
    }
}

int main() {
    scanf("%d %d", &R, &C);

    for(int x = 0; x < R; x++) {
        string temp;
        cin >> temp;
        for(int y = 0; y < C; y++) {
            map[x][y] = temp[y];
            if(map[x][y] == '*') {
                // 물이 있는 칸일 때 큐에 넣음
                q.push({x, y});
                visit[x][y] = true;
            } else if(map[x][y] == 'S') {
                // 고슴도치가 있는 칸일 경우 바로 큐에 넣지 않고 임시저장해둠
                xS = x;
                yS = y;
                visit[x][y] = true;
            } else if(map[x][y] == 'X') {
                // 돌이 있는 경우 
                visit[x][y] = true;
            } else if(map[x][y] == 'D') {
                // 비버굴의 위치를 저장
                xR = x;
                yR = y;
            }
        }
    }

    // 큐에 물이 있는 공간의 위치를 전부 넣어둔 후 고슴도치의 위치를 큐에 넣어준다.
    q.push({xS, yS});

    bfs();

    if(result[xR][yR] == 0) {
        printf("KAKTUS\n");
    } else {
        printf("%d\n", result[xR][yR]);
    }

    return 0;
}
반응형

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

5014 : 스타트링크 (C++)  (0) 2021.03.07
14940 : 쉬운 최단거리 (C++)  (0) 2021.03.02
11607 : Grid (C++)  (0) 2021.03.02
11370 : Spawn of Ungoliant (C++)  (0) 2021.02.27
5378 : Hex (C++)  (0) 2021.02.27

댓글