#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 |