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

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

[์ฝ”๋“œํŠธ๋ฆฌ] BFS ํƒ์ƒ‰ / ๋„ค ๋ฐฉํ–ฅ ํƒˆ์ถœ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํŒ๋ณ„ํ•˜๊ธฐ

๋„ค ๋ฐฉํ–ฅ ํƒˆ์ถœ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํŒ๋ณ„ํ•˜๊ธฐ

n * m ํฌ๊ธฐ์˜ ์ด์ฐจ์› ์˜์—ญ์˜ ์ขŒ์ธก ์ƒ๋‹จ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์šฐ์ธก ํ•˜๋‹จ๊นŒ์ง€ ๋ฑ€์—๊ฒŒ ๋ฌผ๋ฆฌ์ง€ ์•Š๊ณ  ํƒˆ์ถœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋™์„ ํ•  ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ ์ƒํ•˜์ขŒ์šฐ์— ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฑ€์ด ์žˆ๋Š” ์นธ์œผ๋กœ๋Š” ์ด๋™์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ๋ฑ€์ด ๋ฐฐ์น˜ ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์‹ค์„ ๊ณผ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ํƒˆ์ถœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ๋ฑ€์—๊ฒŒ ๋ฌผ๋ฆฌ์ง€ ์•Š๊ณ  ํƒˆ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ codetree

์ž…๋ ฅ ํ˜•์‹

์ฒซ๋ฒˆ์งธ ์ค„์—๋Š” n๊ณผ m์ด ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง€๊ณ ,

๋‘๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ (n+1)๋ฒˆ์งธ ์ค„๊นŒ์ง€๋Š” ๊ฐ ํ–‰์— ๋ฑ€์ด ์—†๋Š” ๊ฒฝ์šฐ 1, ๋ฑ€์ด ์žˆ๋Š” ๊ฒฝ์šฐ 0์ด ์ž…๋ ฅ์œผ๋กœ ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์‹œ์ž‘ ์นธ๊ณผ ๋ ์นธ์—๋Š” ๋ฑ€์ด ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

  • 2 ≤ n, m ≤ 100

์ถœ๋ ฅ ํ˜•์‹

์ขŒ์ธก ์ƒ๋‹จ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์šฐ์ธก ํ•˜๋‹จ๊นŒ์ง€ ๋ฑ€์—๊ฒŒ ๋ฌผ๋ฆฌ์ง€ ์•Š๊ณ  ํƒˆ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์œผ๋ฉด 1, ์—†์œผ๋ฉด 0์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.


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

#include <iostream>
#include <queue>
using namespace std;
#define MAX_N 100
#define MAX_M 100

int n, m;
int a[MAX_N][MAX_M];

// bfs์— ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋“ค ์ž…๋‹ˆ๋‹ค.
queue<pair<int, int> > q;
bool visited[MAX_N][MAX_M];

bool InRange(int x, int y) { // ๊ฒฉ์ž ์•ˆ์ธ์ง€
    return 0 <= x && x < n && 0 <= y && y < m;
}

bool CanGo(int x, int y) { // ๊ฒฉ์ž ์•ˆ, ๋ฑ€์ด ์—†์Œ, ๋ฐฉ๋ฌธํ•œ์  ์—†์Œ
    return InRange(x, y) && a[x][y] && !visited[x][y];
}

bool bfs(int x, int y){
    int dx[4] = {1,0,0,-1};
    int dy[4] = {0,1,-1,0}; // ๊ฒฉ์ž์ด๋ฏ€๋กœ
    q.push(make_pair(x,y));
    visited[x][y]=1;

    while(!q.empty()){
        pair<int,int> a = q.front();
        q.pop();
        for(int i=0; i<4; ++i){
            int new_x = a.first + dx[i];
            int new_y = a.second + dy[i];
            if(CanGo(new_x, new_y)){
                visited[new_x][new_y] = 1;
                q.push(make_pair(new_x, new_y));
            }
        }
    }
    cout << visited[n-1][m-1];
}

int main() {
    cin>>n>>m;
    for(int i=0; i<n; ++i){
        for(int j=0; j<m; ++j){
            cin>>a[i][j];
        }
    }
    bfs(0,0);
    return 0;
}

 

ํƒ์ƒ‰ ์–ด๋ ต๋‹ค...

๊ฒฉ์ž ๋ฌธ์ œ์ด๋ฏ€๋กœ ์ƒํ•˜์ขŒ์šฐ 4 ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๊ณ , 

pair ๋งŒ๋“ค์–ด์„œ pushํ•ด์•ผํ•จ