[c++]๋ฐฑ์ค€ 17836๋ฒˆ : ๊ณต์ฃผ๋‹˜์„ ๊ตฌํ•ด๋ผ!

๋ฌธ์ œ : ๋ฐฑ์ค€ 17836๋ฒˆ _ ๊ณต์ฃผ๋‹˜์„ ๊ตฌํ•ด๋ผ!

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

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งž์€ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
1 ์ดˆ 256 MB 2465 566 431 21.923%

๋ฌธ์ œ

์šฉ์‚ฌ๋Š” ๋งˆ์™•์ด ์ˆจ๊ฒจ๋†“์€ ๊ณต์ฃผ๋‹˜์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด (N, M) ํฌ๊ธฐ์˜ ์„ฑ ์ž…๊ตฌ (1,1)์œผ๋กœ ๋“ค์–ด์™”๋‹ค. ๋งˆ์™•์€ ์šฉ์‚ฌ๊ฐ€ ๊ณต์ฃผ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋„๋ก ์„ฑ์˜ ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ ๋งˆ๋ฒ• ๋ฒฝ์„ ์„ธ์›Œ๋†“์•˜๋‹ค. ์šฉ์‚ฌ๋Š” ํ˜„์žฌ์˜ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฌด๊ธฐ๋กœ๋Š” ๋งˆ๋ฒ• ๋ฒฝ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋งˆ๋ฒ• ๋ฒฝ์„ ํ”ผํ•ด (N, M) ์œ„์น˜์— ์žˆ๋Š” ๊ณต์ฃผ๋‹˜์„ ๊ตฌ์ถœํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

๋งˆ์™•์€ ์šฉ์‚ฌ๋ฅผ ๊ดด๋กญํžˆ๊ธฐ ์œ„ํ•ด ๊ณต์ฃผ์—๊ฒŒ ์ €์ฃผ๋ฅผ ๊ฑธ์—ˆ๋‹ค. ์ €์ฃผ์— ๊ฑธ๋ฆฐ ๊ณต์ฃผ๋Š” T์‹œ๊ฐ„ ์ด๋‚ด๋กœ ์šฉ์‚ฌ๋ฅผ ๋งŒ๋‚˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด ์˜์›ํžˆ ๋Œ๋กœ ๋ณ€ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ณต์ฃผ๋‹˜์„ ๊ตฌ์ถœํ•˜๊ณ  ํ”„๋Ÿฌํฌ์ฆˆ ํ•˜๊ณ  ์‹ถ์€ ์šฉ์‚ฌ๋Š” ๋ฐ˜๋“œ์‹œ T์‹œ๊ฐ„ ๋‚ด์— ๊ณต์ฃผ๋‹˜์ด ์žˆ๋Š” ๊ณณ์— ๋„๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ์šฉ์‚ฌ๋Š” ํ•œ ์นธ์„ ์ด๋™ํ•˜๋Š” ๋ฐ ํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. ๊ณต์ฃผ๋‹˜์ด ์žˆ๋Š” ๊ณณ์— ์ •ํ™•ํžˆ T์‹œ๊ฐ„๋งŒ์— ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ์—๋„ ๊ตฌ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฉ์‚ฌ๋Š” ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

img

์„ฑ์—๋Š” ์ด์ „ ์šฉ์‚ฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ์ „์„ค์˜ ๋ช…๊ฒ€ "๊ทธ๋žŒ"์ด ์ˆจ๊ฒจ์ ธ ์žˆ๋‹ค. ์šฉ์‚ฌ๊ฐ€ ๊ทธ๋žŒ์„ ๊ตฌํ•˜๋ฉด ๋งˆ๋ฒ•์˜ ๋ฒฝ์ด ์žˆ๋Š” ์นธ์ผ์ง€๋ผ๋„, ๋‹จ์ˆจ์— ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ๊ทธ ๊ณต๊ฐ„์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. "๊ทธ๋žŒ"์€ ์„ฑ์˜ ์–ด๋”˜๊ฐ€์— ๋ฐ˜๋“œ์‹œ ํ•œ ๊ฐœ ์กด์žฌํ•˜๊ณ , ์šฉ์‚ฌ๋Š” ๊ทธ๋žŒ์ด ์žˆ๋Š” ๊ณณ์— ๋„์ฐฉํ•˜๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋žŒ์ด ๋ถ€์ˆ  ์ˆ˜ ์žˆ๋Š” ๋ฒฝ์˜ ๊ฐœ์ˆ˜๋Š” ์ œํ•œ์ด ์—†๋‹ค.

์šฐ๋ฆฌ ๋ชจ๋‘ ์šฉ์‚ฌ๊ฐ€ ๊ณต์ฃผ๋‹˜์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ์žˆ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด์ž.

์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์„ฑ์˜ ํฌ๊ธฐ์ธ N, M ๊ทธ๋ฆฌ๊ณ  ๊ณต์ฃผ์—๊ฒŒ ๊ฑธ๋ฆฐ ์ €์ฃผ์˜ ์ œํ•œ ์‹œ๊ฐ„์ธ ์ •์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ฒซ ์ค„์˜ ์„ธ ๊ฐœ์˜ ์ˆ˜๋Š” ๋„์–ด์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. (3 ≤ N, M ≤ 100, 1 ≤ T ≤ 10000)

๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ ์„ฑ์˜ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” M๊ฐœ์˜ ์ˆ˜๊ฐ€ ๋„์–ด์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ๊ณต๊ฐ„, 1์€ ๋งˆ๋ฒ•์˜ ๋ฒฝ, 2๋Š” ๊ทธ๋žŒ์ด ๋†“์—ฌ์žˆ๋Š” ๊ณต๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค. (1,1)๊ณผ (N,M)์€ 0์ด๋‹ค.

์ถœ๋ ฅ

์šฉ์‚ฌ๊ฐ€ ์ œํ•œ ์‹œ๊ฐ„ T์‹œ๊ฐ„ ์ด๋‚ด์— ๊ณต์ฃผ์—๊ฒŒ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ณต์ฃผ์—๊ฒŒ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋งŒ์•ฝ ์šฉ์‚ฌ๊ฐ€ ๊ณต์ฃผ๋ฅผ T์‹œ๊ฐ„ ์ด๋‚ด์— ๊ตฌ์ถœํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, "Fail"์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋‚˜์˜ ๋‹ต

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

#define max_num 10001

int n, m, t;

queue<int> x_pop;
queue<int> y_pop;
int x_arr[5] = { 1,0,-1,0};
int y_arr[5] = { 0,1,0,-1};


int rightPlace(int y, int x) {
    if (x<0 || y<0 || x>=m || y>=n) {
        return 0;
    }
    return 1;
}

int savePrincess(vector<vector<int>>& array) {
    vector<vector<int>> answer(n, vector<int>(m, max_num)); 
    vector<vector<int>> check(n, vector<int>(m));
    vector<vector<int>> queue_check(n, vector<int>(m));

    int x = 0;
    int y = 0;
    int distance = 1;

    int short_x = -1;
    int short_y = -1; 

    x_pop.push(0); y_pop.push(0); // ์‹œ์ž‘ ์œ„์น˜
    answer[0][0] = 0; 
    queue_check[y][x] = 1;
    while (!x_pop.empty() && !y_pop.empty()){
        int size = x_pop.size();
        for (int i = 0; i < size; i++) {
            x = x_pop.front(); y = y_pop.front();
            queue_check[y][x] = 0;
            x_pop.pop(); y_pop.pop();
            if (check[y][x]) {
                continue;
            }
            check[y][x] = 1;

            for (int i = 0; i < 4; i++) {
                x += x_arr[i]; y += y_arr[i];
                if (rightPlace(y, x) && array[y][x] != 1 && !check[y][x] && !queue_check[y][x]) { // ๋งต ์•ˆ์— ์œ„์น˜ํ•˜๋ฉฐ, 1(๋ง‰ํžŒ ๊ณณ)์ด ์•„๋‹ˆ๊ณ , ์ด๋ฏธ ๋“ค๋ฅด์ง€ ์•Š์•˜๊ณ , queue์— ์—†์œผ๋ฉด
                    if (array[y][x] == 2) { // ๊ฒ€์— ๋„๋‹ฌ
                        short_x = x;
                        short_y = y;
                    }

                    if (answer[y][x] > distance) { // ํ˜„์žฌ ๊ธฐ๋ก๋œ ์‹œ๊ฐ„๋ณด๋‹ค ์ ์€ ์‹œ๊ฐ„ ๋‚ด์— ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด
                        answer[y][x] = distance;
                    }

                    x_pop.push(x); y_pop.push(y); // queue์— ๋„ฃ๊ธฐ
                    queue_check[y][x] = 1;
                }
                x -= x_arr[i]; y -= y_arr[i];
            }
        }

        if (check[n - 1][m - 1]) {
            break;
        }

        distance++;
    }

    if (short_x >= 0) { // ๊ฒ€์„ ๋“ค๋ €์„ ๊ฒฝ์šฐ
        return min(answer[n - 1][m - 1], answer[short_y][short_x] + abs(m - 1 - short_x) + abs(n - 1 - short_y));
    }
    else { // ๊ฒ€์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ
        return answer[n - 1][m - 1];
    }
}

int main() {
    cin >> n >> m >> t;
    vector<vector<int>> arr(n, vector<int>(m));

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> arr[i][j];
        }
    }

    int result = savePrincess(arr);
    if (result <= t) {
        cout <<result << endl;
    }
    else {
        cout << "Fail";
    }
}

์ „ํ˜•์ ์ธ BFS ๋ฌธ์ œ๋ผ ์กฐ๊ฑด๋งŒ ์ž˜ ์ฃผ๋ฉด ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์„ ๋“ฏ ํ•˜๋‹ค.

ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค

์ค‘๊ฐ„์— 'ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค' ๊ฐ€ ๋‚˜์™€์„œ ์ด์œ ๋ฅผ ๋ชฐ๋ž๋Š”๋ฐ, ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ์„ ๋„ฃ๋Š” ๋ถ€๋ถ„์—์„œ ์œ„๋กœ ๋‹ค์‹œ ์˜ฌ๋ผ๊ฐˆ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์œ„์ชฝ ๋ฐฉํ–ฅ์„ ๋บ€ ๊ฒƒ์ด ๋ฌธ์ œ์˜€๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์œ„์ชฝ์œผ๋กœ ๊ฐ€๋Š” ๋ฐฉํ–ฅ๋„ ๊ณ ๋ คํ•ด์•ผํ•  ๊ฒƒ์ด ๋‹น์—ฐํ•˜๋‹ค. (๋„๋•๋„๋•)

์ฝ”๋“œ ๋ณด์™„

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ๊นŒ queue๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ๋‚˜์ฒ˜๋Ÿผ x, y ์ขŒํ‘œ๋ฅผ ๋”ฐ๋กœ ๋‘์ง€ ์•Š๊ณ  ๊ตฌ์กฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ queue<๊ตฌ์กฐ์ฒด>๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๊ณ  ์ข‹์„ ๋“ฏ ํ•˜๋‹ค.

๋ฐ˜์‘ํ˜•