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

using namespace std;

int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
int n, m;
pair<int, int> s;
vector<pair<int, int>> g;
char maze[1001][1001];
bool visited[1001][1001];

int get_ghost_min_dist(int h, int w, vector<pair<int, int>>& ghost) {
    int dist = 2001;
    for (auto& g : ghost) {
        dist = min(dist, abs(h - g.first) + abs(w - g.second));
    }
    return dist;
}

bool bfs(pair<int, int> start, vector<pair<int, int>>& ghost) {
    queue<pair<pair<int, int>, int>> q;  // ((y, x), depth)
    q.push({start, 0});
    visited[start.first][start.second] = true;

    while (!q.empty()) {
        auto [pos, d] = q.front();
        int h = pos.first, w = pos.second;
        q.pop();

        if (maze[h][w] == 'D') {
            cout << "Yes" << endl;
            return true;
        }

        if (d >= get_ghost_min_dist(h, w, ghost)) {
            visited[h][w] = true;
            continue;
        }

        for (int i = 0; i < 4; i++) {
            int next_y = h + dy[i];
            int next_x = w + dx[i];
            if (next_y >= 0 && next_y < n && next_x >= 0 && next_x < m && !visited[next_y][next_x] && maze[next_y][next_x] != '#') {
                visited[next_y][next_x] = true;
                q.push({{next_y, next_x}, d + 1});
            }
        }
    }

    return false;
}

int main(int argc, char** argv) {
    cin >> n >> m;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> maze[i][j];
            visited[i][j] = false;
            if (maze[i][j] == 'N') {
                s = {i, j};
            }
            else if (maze[i][j] == 'G') {
                g.push_back({i, j});
            }
        }
    }

    if (!bfs(s, g)) {
        cout << "No" << endl;
    }

    return 0;
}

핵심은 bfs 돌면서
1. '지금 위치에서 유령들과의 거리의 최소값'
2. '시작위치에서 지금 위치까지의 거리'
를 비교해서 1이 더 작거나 같으면, 유령이 우리 남우씨를 잡게되니까 그 위치는 탐색중단합니다

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

프로그래머스 - 주식 가격 (c++)  (0) 2025.02.23
프로그래머스 - 게임 맵 최단거리 (c++)  (0) 2025.02.23
Lv. 3 징검다리 - C++  (0) 2024.12.10
Lv. 3 함께하는 효도 - C++  (0) 2024.12.10
Lv. 3 자동차 테스트  (0) 2024.12.10

+ Recent posts