๐Ÿ• Baaaaaarking/0x09๊ฐ• - BFS

[BOJ G4][C++] ๋ฐฑ์ค€ 2206๋ฒˆ : ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

์„ ๋‹ฌ 2022. 4. 13. 18:05
๋ฐ˜์‘ํ˜•

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

 

2206๋ฒˆ: ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

N×M์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ๋งต์ด ์žˆ๋‹ค. ๋งต์—์„œ 0์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 1์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ์ด ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹น์‹ ์€ (1, 1)์—์„œ (N, M)์˜ ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•˜๋ ค ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ตœ๋‹จ ๊ฒฝ๋กœ

www.acmicpc.net

 

๋ฌธ์ œ

N×M์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ๋งต์ด ์žˆ๋‹ค. ๋งต์—์„œ 0์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 1์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ์ด ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹น์‹ ์€ (1, 1)์—์„œ (N, M)์˜ ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•˜๋ ค ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋ ค ํ•œ๋‹ค. ์ตœ๋‹จ๊ฒฝ๋กœ๋Š” ๋งต์—์„œ ๊ฐ€์žฅ ์ ์€ ๊ฐœ์ˆ˜์˜ ์นธ์„ ์ง€๋‚˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๋งํ•˜๋Š”๋ฐ, ์ด๋•Œ ์‹œ์ž‘ํ•˜๋Š” ์นธ๊ณผ ๋๋‚˜๋Š” ์นธ๋„ ํฌํ•จํ•ด์„œ ์„ผ๋‹ค.

๋งŒ์•ฝ์— ์ด๋™ํ•˜๋Š” ๋„์ค‘์— ํ•œ ๊ฐœ์˜ ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊ฒฝ๋กœ๊ฐ€ ์งง์•„์ง„๋‹ค๋ฉด, ๋ฒฝ์„ ํ•œ ๊ฐœ ๊นŒ์ง€ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜์—ฌ๋„ ๋œ๋‹ค.

ํ•œ ์นธ์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ์นธ์ด๋‹ค.

๋งต์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด ๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— M๊ฐœ์˜ ์ˆซ์ž๋กœ ๋งต์ด ์ฃผ์–ด์ง„๋‹ค. (1, 1)๊ณผ (N, M)์€ ํ•ญ์ƒ 0์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

์ผ๋ฐ˜ bfs ๋ฌธ์ œ์™€๋Š” ๋‹ฌ๋ฆฌ ๋ฒฝ์„ ๋ถ€์ˆ˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค..

๊ณ ๋ฏผ์„ ์ข€ ๋งŽ์ด ํ–ˆ๋Š”๋ฐ ๊ทธ๋ƒฅ ๊ฑฐ๋ฆฌ ํ‘œ์‹œํ•˜๋Š” ์ด์ค‘๋ฐฐ์—ด์„ ๋‘๊ฐœ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค (๊ฒฐ๊ตญ์€ ์‚ผ์ค‘๋ฐฐ์—ด..)

๋ฒฝ์„ ํ•œ๋ฒˆ์ด๋ผ๋„ ๋ถ€์ˆœ ํ›„ ์ง„ํ–‰ํ•˜๋ฉด dis[x][y][1] ์— ๊ธฐ๋ก๋˜๊ณ 

๋ฒฝ์„ ํ•œ๋ฒˆ๋„ ๋ถ€์ˆ˜์ง€ ์•Š์•˜๋‹ค๋ฉด dis[x][y][0] ์— ์ง„ํ–‰์ƒํ™ฉ์ด ๊ธฐ๋ก๋œ๋‹ค

 

์‚ผ์ค‘๋ฐฐ์—ด์ด๋ผ pair ๊ฐ€ ์•„๋‹Œ tuple ์„ ์‚ฌ์šฉํ•ด์•ผํ–ˆ๊ณ 

bfs ๋ฅผ ๋Œ๋ฆฌ๋ฉฐ ์ด๋™ํ• ๋•Œ๋Š” ๋ฒฝ์„ ๋ถ€์ˆ˜๋Š” ๊ฒฝ์šฐ์™€ ์•„๋‹Œ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ ์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค

์ด๋•Œ ์กฐ๊ฑด์„ ์‹ ๊ฒฝ์จ์„œ ๊ฑธ์–ด์คฌ๋‹ค (์ฝ”๋“œ ์ฐธ๊ณ )

 

์ฃผ์˜ํ•ด์•ผํ•  ์š”์†Œ๋Š”

1. ์ธํ’‹์— ๋„์–ด์“ฐ๊ธฐ๊ฐ€ ์—†๊ธฐ๋•Œ๋ฌธ์— board ๋ฅผ char ๋กœ ๋ฐ›์•„์•ผํ•œ๋‹ค

2. ๋ฒฝ ๋ถ€์ˆจ ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋กํ•ด๋†“๊ณ  ์ถœ๋ ฅํ• ๋•Œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ถœ๋ ฅํ•ด์•ผํ•œ๋‹ค

3. ์ง€๋‚˜๊ฐ„ ์นธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ (0,0) ๊ฐ’์„ 1๋กœ ๋‘ฌ์•ผํ•œ๋‹ค

์ด ์ •๋„?

// Authored by : seondal
// ํ’€์ด : https://whkakrkr.tistory.com/
// Co-authored by : -

//#include <bits/stdc++.h>
#include <iostream>
#include <queue>

using namespace std;

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

int n,m;
char board[1002][1002];

int dis[1002][1002][2];
queue<tuple<int,int,int>> q;
bool broken = false;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    // ์ž…๋ ฅ
    cin >> n >> m;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin >> board[i][j];
            dis[i][j][0] = -1;
            dis[i][j][1] = -1;
        }
    }
    q.push({0,0,0});
    dis[0][0][0] = 1;
    dis[0][0][1] = 1;
    // ์ด ๋ฌธ์ œ๋Š” ์ง€๋‚˜๊ฐ„ ์นธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์นด์šดํŠธํ•ด์•ผํ•˜๋ฏ€๋กœ ์ดˆ๊นƒ๊ฐ’์ด 1์ธ๊ฒƒ์— ์ฃผ์˜
    
    // ๊ณ„์‚ฐ
    while(!q.empty()){
        int cx,cy,cb;
        tie(cx,cy,cb) = q.front();
        q.pop();
        
        for(int dir=0; dir<4; dir++) {
            int x = cx + dx[dir];
            int y = cy + dy[dir];
            
            if(x<0 || x>=n || y<0 || y>=m) continue;
            
            // ๋ถ€์ˆ˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ -> ๊ฐˆ๊ณณ์ด ๋ฒฝ์ด ์•„๋‹ˆ๊ณ , ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€๊ฒฝ์šฐ
            if(board[x][y]=='0' && dis[x][y][cb]==-1) {
                dis[x][y][cb] = dis[cx][cy][cb] + 1;
                q.push({x,y,cb});
            }
            
            // ๋ถ€์ˆ˜๋Š” ๊ฒฝ์šฐ -> ์•„์ง ์•ˆ๋ถ€์…จ๊ณ , ๊ฐˆ๊ณณ์ด ๋ฒฝ์ด๊ณ , ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
            if(cb==0 && board[x][y]=='1' && dis[x][y][1]==-1) {
                dis[x][y][1] = dis[cx][cy][cb] + 1;
                q.push({x,y,1});
                broken = true;
            }
        }
    }
    
    if(broken)
        cout << dis[n-1][m-1][1];
    else
        cout << dis[n-1][m-1][0];
    
    return 0;
}

/*
 */
๋ฐ˜์‘ํ˜•