๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 14940 : ์‰ฌ์šด ์ตœ๋‹จ๊ฑฐ๋ฆฌ (BFS) / test case

๋ฌธ์ œ

์ง€๋„๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๋ชจ๋“  ์ง€์ ์— ๋Œ€ํ•ด์„œ ๋ชฉํ‘œ์ง€์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ.

๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์˜ค์ง ๊ฐ€๋กœ์™€ ์„ธ๋กœ๋กœ๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

์ž…๋ ฅ

์ง€๋„์˜ ํฌ๊ธฐ n๊ณผ m์ด ์ฃผ์–ด์ง„๋‹ค. n์€ ์„ธ๋กœ์˜ ํฌ๊ธฐ, m์€ ๊ฐ€๋กœ์˜ ํฌ๊ธฐ๋‹ค.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000)

๋‹ค์Œ n๊ฐœ์˜ ์ค„์— m๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 0์€ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๋•…์ด๊ณ  1์€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋•…, 2๋Š” ๋ชฉํ‘œ์ง€์ ์ด๋‹ค. ์ž…๋ ฅ์—์„œ 2๋Š” ๋‹จ ํ•œ๊ฐœ์ด๋‹ค.

์ถœ๋ ฅ

๊ฐ ์ง€์ ์—์„œ ๋ชฉํ‘œ์ง€์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์›๋ž˜ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๋•…์ธ ์œ„์น˜๋Š” 0์„ ์ถœ๋ ฅํ•˜๊ณ , ์›๋ž˜ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋•…์ธ ๋ถ€๋ถ„ ์ค‘์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ์œ„์น˜๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

์‰ฝ๋‹ค๋งค....์‰ฝ๋‹ค๋งค..!!!!..!!

 

๋ฐฑ์ค€ ์‹ค๋ฒ„ 1.

์˜ˆ์ „์—๋Š” ๊ณจ5์˜€๋˜ ๋“ฏ ํ•˜๋‹ค

 

ํ•˜ ์ง„์งœ

ํ˜ผ์ž ๋™๋™๋Œ€๋ฉด์„œ ํ•œ์‹œ๊ฐ„๋™์•ˆ ์—ด์‹ฌํžˆ ํ’€์—ˆ๋‹ค

๋งž์ถ”๊ณ  ๋‚˜์„œ ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ์™œ ์ด๋ ‡๊ฒŒ ํ–ˆ์ง€..?์‹ถ์€ ๋ถ€๋ถ„๋„ ์žˆ์—ˆ์Œ ใ…‹ใ…‹ใ…‹

๊ทธ๋ž˜๋„ ๊ท€์ฐฎ์œผ๋‹ˆ๊นŒ ๊ทธ๋ƒฅ ๋†”๋‘”๋‹ค.

 

์‹ฌ์ง€์–ด ์ฒ˜์Œ์—๋Š” dp์ธ์ค„ ์•Œ์•˜๋‹ค๊ฐ€ ํ’€๋ฉด์„œ bfs์ธ๊ฑฐ ๊นจ๋‹ฌ์•˜๋‹ค.

 

์ œ๋ชฉ์€ ํ•จ์ •์ด์—ˆ๋‹ค๋Š” ๊ฒƒ๋„ ๊นจ๋‹ฌ์•˜๋‹ค. (์‰ฌ์šด?)

 

 

1. ์ผ๋‹จ ์ž…๋ ฅ์šฉ ์ด์ฐจ์›๋ฐฐ์—ด, visited ์ด์ฐจ์›๋ฐฐ์—ด, ๊ฒฐ๊ณผ ์ €์žฅ์šฉ ์ด์ฐจ์›๋ฐฐ์—ด,, ์ด๋ ‡๊ฒŒ 3๊ฐœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค

2. ์‹œ์ž‘์ ์„ ์ฐพ๋Š”๋‹ค. ์ž…๋ ฅ์ด 2์ธ ๋ถ€๋ถ„์„.. ์ž…๋ ฅ๋ฐ›์œผ๋ฉด์„œ ์ฐพ์œผ๋ฉด ๋˜๋Š”๋ฐ ๋‚˜๋Š” ์ž…๋ ฅ ๋‹ค ๋ฐ›๊ณ  ๋‹ค์‹œ ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ฆฌ๋ฉด์„œ ํ–ˆ์Œใ…‹ใ…‹

3. makeMap() ์ด๊ฒŒ bfs ํ•จ์ˆ˜์ด๋‹ค. bfs๋Š” ๋ณ„๋‹ค๋ฅธ๊ฒŒ ์—†๋Š”๋ฐ -1 ์ถœ๋ ฅํ•˜๋Š”๊ฒŒ ์€๊ทผ ๊นŒ๋‹ค๋กœ์› ์Œ

4. ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๊ณ  && ์ž…๋ ฅ๊ฐ’์ด 1์ธ ๋ถ€๋ถ„๋งŒ -1๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

 

 

-1์ด ๋‚˜์˜ค๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ํ•˜๋‚˜ ๋“œ๋ฆฌ์ž๋ฉด,

input

15 15
2 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 1 0 0 0
1 1 1 1 1 1 1 1 1 1 0 1 1 0 1     -> ๋งˆ์ง€๋ง‰ 1์ด 0์— ๋‘˜๋Ÿฌ์‹ธ์—ฌ์„œ ๊ฐ‡ํžˆ๊ฒŒ ๋จ

 

output

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
11 12 13 14 15 16 17 18 19 20 0 0 0 0 25 
12 13 14 15 16 17 18 19 20 21 0 29 28 27 26 
13 14 15 16 17 18 19 20 21 22 0 30 0 0 0 
14 15 16 17 18 19 20 21 22 23 0 31 32 0 -1     -> -1๋กœ ์ถœ๋ ฅ.

 

 

๋‚˜์˜ ํ’€์ด

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

int n;
int m;
int in[1002][1002] = {0,};
int mat[1002][1002]={0,};
int visited[1002][1002] = {0,};

pair<int,int> searchTwo(){
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            if(in[i][j]==2) return {i,j}; // ์ด์ œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์ž…๋ ฅํ• ๋•Œ ์ด๊ฑธ ์žก์•„๋‚ด๋„ ๋˜๋Š”๋ฐ ์™œ์ด๋ ‡๊ฒŒ ํ–ˆ์ง€
        }
    }
    return {0,0};
}

bool canGo(int x, int y){
    if(visited[x][y]==1 || in[x][y]==0) return false;
    if(x<0 || y<0 || x>=n || y>=m) return false;
    return true;
}

void makeMap(){
    pair<int,int> idx = searchTwo();
    int dx[4] = {0, 1, 0, -1};
    int dy[4] = {1, 0, -1, 0};
    queue<pair<int, int>> q;
    q.push(idx);
    mat[idx.first][idx.second] = 0;
    while(!q.empty()){
        pair<int, int> a = q.front();
        q.pop();
        for (int i = 0; i < 4; ++i){
            int nx = a.first + dx[i];
            int ny = a.second + dy[i];
            if(idx == make_pair(nx,ny)){
                continue;
            }
            if(canGo(nx, ny)){
                q.push(make_pair(nx, ny));
                mat[nx][ny] = mat[a.first][a.second] + 1;
                visited[nx][ny] = 1;
            }
        }
    }

    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            if(visited[i][j]==0 && in[i][j]==1) mat[i][j] = -1; // ์ด๊ฑฐ๋•Œ๋ฉ” ํ•œ์ฐธ ์‚ฝ์งˆํ•จ;;
            cout << mat[i][j] << " ";
        }
        cout << "\n";
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

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