μƒˆμ†Œμ‹

μ•Œκ³ λ¦¬μ¦˜/BaekJoon

[C++] BOJ 2178번: 미둜 탐색

  • -
728x90

문제

1은 이동할 수 μžˆλŠ” μΉΈ, 0은 이동할 수 μ—†λŠ” 칸을 λ‚˜νƒ€λ‚Έλ‹€.

(1,1)μ—μ„œ μΆœλ°œν•˜μ—¬ (N,M)의 μœ„μΉ˜λ‘œ 이동할 λ•Œ μ§€λ‚˜μ•Ό ν•˜λŠ” μ΅œμ†Œ 칸의 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯ 1

4 6
101111
101010
101011
111011

좜λ ₯ 1

15

μ½”λ“œ

#include<iostream>
#include<queue>
#include<algorithm>
#define MAX 101

using namespace std;

int MAP[MAX][MAX];
int visited[MAX][MAX];
int dist[MAX][MAX];
int arrow[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
int N, M;
pair<int, int> startP, endP;

queue < pair<int, int>> Q;

void BFS() {
    
    Q.push(make_pair(startP.first, startP.second));

    dist[startP.first][startP.second]++;
    visited[startP.first][startP.second] = 1;

    while (!Q.empty()) {
        int y = Q.front().first;
        int x = Q.front().second;
        Q.pop();
        //μ’Œμš°μœ„μ•„λž˜ 탐색
        for (int i = 0; i < 4; i++) {
            int ny = y + arrow[i][0];
            int nx = x + arrow[i][1];


            if ((nx >= 0 &&nx < M) && (ny >= 0 && ny < N)
                && MAP[ny][nx] == 1 &&!visited[ny][nx]) {
                visited[ny][nx] = 1;
                Q.push(make_pair(ny, nx));
                dist[ny][nx] = dist[y][x] + 1;
            }
        }
    }
    cout << dist[endP.first-1][endP.second-1];
}


void input() {
    string num;
    for (int i = 0; i < N; i++) {
        cin >> num;
        for (int j = 0; j < M; j++) {
            MAP[i][j] = num[j]-'0';
        }
    }
}

int main() {

    cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);

    int tmp;
    cin >> N>>M;
    startP = make_pair(0, 0);
    endP = make_pair(N, M);
    
    input();
    BFS();

    return 0;
}

 

*κ°„λ‹¨ν•œ ν•΄μ„€*

μ € input ν•¨μˆ˜μ—μ„œ cin을 톡해 MAP을 λ°›μ•„μ˜΅λ‹ˆλ‹€.

μ£Όμ˜ν•  점은 ν•œ 쀄당 λΆ™μ–΄μžˆλŠ” μƒνƒœλ‘œ λ°›μ•„μ™€μ„œ cin으둜 받은 λ‹€μŒ λŠμ–΄μ„œ μ €μž₯ν•΄μ£Όμ–΄μ•Όν•©λ‹ˆλ‹€.

void input() {
    string num;
    for (int i = 0; i < N; i++) {
        cin >> num;
        for (int j = 0; j < M; j++) {
            MAP[i][j] = num[j]-'0';
        }
    }
}

string으둜 받은 λ‹€μŒ stringμ—μ„œ 인자둜 μ ‘κ·Όν•΄μ£Όλ©΄ char ν˜•μ΄μ—¬μ„œ charν˜•μ„ int둜 λ°”κΎΈλ €λ©΄ '0'의 숫자λ₯Ό λΉΌμ£Όλ©΄ λ©λ‹ˆλ‹€.

κ·ΈλŸ°λ‹€μŒ BFS 탐색을 톡해 μ΅œλ‹¨ 경둜λ₯Ό μ°Ύμ•„μ£Όλ©΄ λ˜λŠ”λ° BOJ 6087번 λ ˆμ΄μ € 톡신과 λ¬Έμ œκ°€ 맀우 ν‘μ‚¬ν•©λ‹ˆλ‹€.

https://dana3711.tistory.com/90

 

[C++] BOJ 6087번: λ ˆμ΄μ € 톡신

문제 κ±°μšΈμ„ μ„€μΉ˜ν•˜λ©΄ λ°©ν–₯을 90도 νšŒμ „μ‹œν‚¬ 수 μžˆλ‹€. *은 벽으둜 뚫고 μ§€λ‚˜κ°ˆ 수 μ—†λ‹€. κ±°μšΈμ„ μ΅œμ†Œλ‘œ μ„€μΉ˜ν•˜μ—¬μ„œ 처음 μ‹œμž‘μ§€μ  Cμ—μ„œ 끝지점 C에 λ„λ‹¬ν• λ•ŒκΉŒμ§€ κ°€μ•Όν•œλ‹€. μ΅œμ†Œλ‘œ μ„€μΉ˜ν•  수 있

dana3711.tistory.com

λ‹€λ§Œ λ‹€λ₯Έμ μ€ λͺ©ν‘œ μ§€μ κΉŒμ§€ κ°€λŠ”λ° κ±Έλ¦¬λŠ” λΉ„μš©μ„ 좜λ ₯ν•΄μ•Όν•œλ‹€λŠ” μ μž…λ‹ˆλ‹€. λ”°λΌμ„œ

if ((nx >= 0 &&nx < M) && (ny >= 0 && ny < N)&& MAP[ny][nx] == 1 &&!visited[ny][nx]) 
{
    visited[ny][nx] = 1;
    Q.push(make_pair(ny, nx));
    dist[ny][nx] = dist[y][x] + 1;
}

4λ°©ν–₯ 탐색을 ν• λ•Œ λ§Œμ•½ 맡 μ•ˆμ— 있고((nx >= 0 &&nx < M) && (ny >= 0 && ny < N)), κ·Έ 칸이 이동할 수 μžˆλŠ” 칸이라면(MAP[ny][nx] == 1) ν•΄λ‹Ή 칸을 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜μ„ λ•Œ

ν•΄λ‹Ή 칸으둜 자리λ₯Ό μ΄λ™ν•˜κ³  κ°€λŠ” λΉ„μš©μ„ +1 ν•΄μ€λ‹ˆλ‹€.

 

 

 

 

*이 λ°©λ²•λ§Œμ΄ λ§žλŠ” 정닡은 μ•„λ‹™λ‹ˆλ‹€.

훨씬 μ’‹κ³  λΉ λ₯Έ λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•Œκ³ λ¦¬μ¦˜ κ³΅λΆ€ν•˜μ‹œλŠ” λΆ„λ“€ ν™”μ΄νŒ…! '0'/*

 

λ°˜μ‘ν˜•
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.