𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 2178번: 미둜 탐색 - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 2178번: 미둜 탐색 - C++

.23 2022. 1. 4. 17:58
문제

N×M크기의 λ°°μ—΄λ‘œ ν‘œν˜„λ˜λŠ” λ―Έλ‘œκ°€ μžˆλ‹€.

1 0 1 1 1 1
1 0 1 0 1 0
1 0 1 0 1 1
1 1 1 0 1 1

λ―Έλ‘œμ—μ„œ 1은 이동할 수 μžˆλŠ” 칸을 λ‚˜νƒ€λ‚΄κ³ , 0은 이동할 수 μ—†λŠ” 칸을 λ‚˜νƒ€λ‚Έλ‹€. μ΄λŸ¬ν•œ λ―Έλ‘œκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, (1, 1)μ—μ„œ μΆœλ°œν•˜μ—¬ (N, M)의 μœ„μΉ˜λ‘œ 이동할 λ•Œ μ§€λ‚˜μ•Ό ν•˜λŠ” μ΅œμ†Œμ˜ μΉΈ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. ν•œ μΉΈμ—μ„œ λ‹€λ₯Έ 칸으둜 이동할 λ•Œ, μ„œλ‘œ μΈμ ‘ν•œ 칸으둜만 이동할 수 μžˆλ‹€.

μœ„μ˜ μ˜ˆμ—μ„œλŠ” 15칸을 μ§€λ‚˜μ•Ό (N, M)의 μœ„μΉ˜λ‘œ 이동할 수 μžˆλ‹€. 칸을 μ…€ λ•Œμ—λŠ” μ‹œμž‘ μœ„μΉ˜μ™€ 도착 μœ„μΉ˜λ„ ν¬ν•¨ν•œλ‹€.

 

μž…λ ₯

첫째 쀄에 두 μ •μˆ˜ N, M(2 ≤ N, M ≤ 100)이 주어진닀. λ‹€μŒ N개의 μ€„μ—λŠ” M개의 μ •μˆ˜λ‘œ λ―Έλ‘œκ°€ 주어진닀. 각각의 μˆ˜λ“€μ€ λΆ™μ–΄μ„œ μž…λ ₯으둜 주어진닀.

 

좜λ ₯

첫째 쀄에 μ§€λ‚˜μ•Ό ν•˜λŠ” μ΅œμ†Œμ˜ μΉΈ 수λ₯Ό 좜λ ₯ν•œλ‹€. 항상 λ„μ°©μœ„μΉ˜λ‘œ 이동할 수 μžˆλŠ” 경우만 μž…λ ₯으둜 주어진닀.


각각의 μˆ˜κ°€ λΆ™μ–΄μ„œ μž…λ ₯으둜 주어지면 2667번: λ‹¨μ§€λ²ˆν˜ΈλΆ™μ΄κΈ° 처럼 λ¬Έμžμ—΄λ‘œ μž…λ ₯받은 λ’€ ν•œ λ¬Έμžμ”© μ •μˆ˜λ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” 방법도 있고, λ‹€μŒκ³Ό 같이 scanf("%1d"); λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•œ 자리수의 μ •μˆ˜λ§Œ μž…λ ₯λ°›λŠ” 방법도 μžˆλ‹€.

접근방식은 7576번: ν† λ§ˆν†  와 λ™μΌν•˜λ‹€. BFSλ₯Ό 톡해 μΈμ ‘ν•œ μ˜μ—­μ—μ„œ 이동할 수 μžˆλŠ” 칸을 μ‘°μ‚¬ν•˜κ³ , 이동할 수 μžˆλŠ” 칸인 경우 μ—¬νƒœκΉŒμ§€ μ΄λ™ν•œ 횟수둜 값을 λ°”κΏ”μ€€λ‹€. κ°€μž₯ λ§ˆμ§€λ§‰μ— λ„μ°©ν•œ maze[n][m]에 적힌 μˆ«μžκ°€ (N, M)μœ„μΉ˜κΉŒμ§€ 왔을 λ•Œμ˜ μ΅œμ†Œμ˜ μΉΈ μˆ˜κ°€ λœλ‹€.

 

μ½”λ“œ
#include <cstdio>
#include <queue>
#define MAX 101

using namespace std;

int maze[MAX][MAX];
int n, m;
int dx[] = { 1, -1, 0, 0 };
int dy[] = { 0, 0, 1, -1 };

void BFS();
int count;
queue<pair<int, int> > q;

int main(void) {    
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            scanf("%1d", &maze[i][j]);
        }
    }

    BFS();

    printf("%d\n", maze[n][m]);
    return 0;
}

void BFS() {
    q.push(pair<int, int>(1, 1));
    while(!q.empty()) {
        int x = q.front().second;
        int y = q.front().first;

        q.pop();
        for(int i = 0; i < 4; i++) {
            if(x + dx[i] < 1 || x + dx[i] > m || y + dy[i] < 1 || y + dy[i] > n) continue;
            if(maze[y + dy[i]][x + dx[i]] == 1) {
                maze[y + dy[i]][x + dx[i]] = maze[y][x] + 1;
                q.push(pair<int, int>(y + dy[i], x + dx[i]));
            }
        }
    }
}
Comments