๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 2178 ๋ฏธ๋กœ ํƒ์ƒ‰ bfs

by Jouureee 2021. 2. 17.

๋ฌธ์ œ : 

www.acmicpc.net/problem/2178

 

2178๋ฒˆ: ๋ฏธ๋กœ ํƒ์ƒ‰

์ฒซ์งธ ์ค„์— ๋‘ ์ •์ˆ˜ N, M(2 ≤ N, M ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” M๊ฐœ์˜ ์ •์ˆ˜๋กœ ๋ฏธ๋กœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ๊ฐ์˜ ์ˆ˜๋“ค์€ ๋ถ™์–ด์„œ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

๋ถ„์„ :

์ด ๋ฌธ์ œ๋Š” ๊ฒฝ๋กœ ํƒ์ƒ‰ ๋ฌธ์ œ์ด๋‹ค. DFS, BFS ๋‘˜ ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ ํ’€์–ด๋„ ์ƒ๊ด€ ์—†์–ด ๋ณด์ธ๋‹ค. ๋‚˜๋Š” BFS ์—ฐ์Šต์„ ์œ„ํ•ด BFS ๋ฐฉ์‹์œผ๋กœ ํ’€์—ˆ๋‹ค. cin ์€ ๊ณต๋ฐฑ ๊ธฐ์ค€์œผ๋กœ input์„ ๋ฐ›๋Š” ๊ฒƒ ๊ฐ™์•„์„œ scanf์˜ ๋„์›€์„ ๋ฐ›์•˜๋‹ค. cin ์œผ๋กœ ํ’€ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ• ์•Œ๋ฉด ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿฅบ 

2์ฐจ์› ํ–‰๋ ฌ์— ๊ฐ’์ด 1 (์ง€๋‚˜๊ฐˆ ์ˆ˜์žˆ๋Š” ์นธ) ์ธ๊ฒฝ์šฐ true๋กœ ๋‹ด์•˜๊ณ  ์•„๋‹ˆ๋ฉด false๋กœ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•˜์˜€๋‹ค. 

์ด ๋ฌธ์ œ๋Š” input ๊ฐ’์ด 0,0 ์ผ๋•Œ ๋ชจ๋‘ 1์ด์–ด์„œ start๋ฅผ 0,0 ์œผ๋กœ ๊ณ ์ •์‹œ์ผœ ํ–ˆ๋Š”๋ฐ ๋‹ค๋ฅธ ๋ฌธ์ œ ํ’€๋•Œ์—๋Š” 0,0์ด 1์ธ์ง€ ํ™•์ธ ํ•œ ๋’ค์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์„ ์ฐพ์œผ๋ฉด ๊ทธ๋•Œ start๊ฐ’์œผ๋กœ ๋„ฃ์–ด์ค˜์•ผ๊ฒ ๋‹ค

๋จผ์ € queue์— ์ฐพ์€ ์ขŒํ‘œ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ  up down left right๋ฅผ ๋Œ๋ฉด์„œ 1์ด ์žˆ๋‹ค๋ฉด ๊ทธ๋ฆฌ๊ณ  visitํ•œ ์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋‹ค์‹œ q์— push ํ•˜๋ฉฐ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค. visit์— ๊ฐ’์„ ๋ˆ„์ ์‹œํ‚จ ๋’ค ๊ทธ ๊ฐ’์„ ์ธ์ž๋กœ ์ „๋‹ฌํ–ˆ๋‹ค. ์ด์ƒํ•˜๊ฒŒ cnt ๋ณ€์ˆ˜๋กœ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด ์•ˆ๋œ๋‹ค.. ๋ญ˜๊นŒ ํ•˜๋‚˜์”ฉ ์ ๊ฒŒ ๋‚˜์˜จ๋‹ค 

 

c++ ์ฝ”๋“œ :

//
//  2178_miro.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/02/13.
//

#include <stdio.h>
#include <cstdio>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;
#define MAX 100

int visit[MAX][MAX];
bool map[MAX][MAX];

int N, M;
int dx[] = { 0, 0, 1, -1 }; //up down left right
int dy[] = { 1, -1, 0, 0 };

int miro_bfs(pair<int, int> start){
    //memset(visit, false, sizeof(visit));
    visit[start.second][start.first] = true;

    queue<pair<int,int>>q;
    q.push(make_pair(start.second, start.first));
    while (!q.empty()) {
        int y = q.front().first;
        int x = q.front().second;
        //cout << y << " " << x << endl;
        q.pop();

        for(int i = 0; i < 4; i++){
            int nx = x + dx[i];
            int ny = y + dy[i];

            if(nx >= 0 && ny >= 0 && ny < N && nx < M){
                if(visit[ny][nx] == false && map[ny][nx]){ // ๋ฐฉ๋ฌธ x ์ด๊ณ  ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ด๋ฉด
                    visit[ny][nx] = visit[y][x] + 1;
                    q.push(make_pair(ny, nx));
                }
            }
        }
    }
    return visit[N-1][M-1];
}


int main(){
    cin >> N >> M;
    //cout << N << M;
    for(int i = 0; i < N; i++){
        for(int j = 0; j < M; j++){
            int a;
            scanf("%1d", &a);

            if(a == 1){
                map[i][j] = true;
            }else{
                map[i][j] = false;
            }
        }
    }
//input ํ™•์ธ
//    for(int i = 0; i < N; i++){
//        for(int j = 0; j < M; j++){
//            cout << map[i][j] << " " ;
//        }
//        cout << endl;
//    }


    pair<int, int> start = make_pair(0, 0);

    cout << miro_bfs(start) << endl;

    return 0;
}



๋Œ“๊ธ€