πŸ’»

[λ°±μ€€] DFSBFS - 7576. ν† λ§ˆν†  λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ¬Έμ œν’€μ΄ Baekjoon

[λ°±μ€€] DFSBFS - 7576. ν† λ§ˆν† 

λ˜νš¨λ‹ˆ 2020. 9. 29. 08:23

문제

철수의 ν† λ§ˆν†  농μž₯μ—μ„œλŠ” ν† λ§ˆν† λ₯Ό λ³΄κ΄€ν•˜λŠ” 큰 μ°½κ³ λ₯Ό 가지고 μžˆλ‹€. ν† λ§ˆν† λŠ” μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό 같이 격자 λͺ¨μ–‘ μƒμžμ˜ 칸에 ν•˜λ‚˜μ”© λ„£μ–΄μ„œ 창고에 λ³΄κ΄€ν•œλ‹€. 

창고에 λ³΄κ΄€λ˜λŠ” ν† λ§ˆν† λ“€ μ€‘μ—λŠ” 잘 읡은 것도 μžˆμ§€λ§Œ, 아직 읡지 μ•Šμ€ ν† λ§ˆν† λ“€λ„ μžˆμ„ 수 μžˆλ‹€. 보관 ν›„ ν•˜λ£¨κ°€ μ§€λ‚˜λ©΄, 읡은 ν† λ§ˆν† λ“€μ˜ μΈμ ‘ν•œ 곳에 μžˆλŠ” 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ€ 읡은 ν† λ§ˆν† μ˜ 영ν–₯을 λ°›μ•„ 읡게 λœλ‹€. ν•˜λ‚˜μ˜ ν† λ§ˆν† μ˜ μΈμ ‘ν•œ 곳은 μ™Όμͺ½, 였λ₯Έμͺ½, μ•ž, λ’€ λ„€ λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ₯Ό μ˜λ―Έν•œλ‹€. λŒ€κ°μ„  λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ“€μ—κ²ŒλŠ” 영ν–₯을 주지 λͺ»ν•˜λ©°, ν† λ§ˆν† κ°€ 혼자 μ €μ ˆλ‘œ μ΅λŠ” κ²½μš°λŠ” μ—†λ‹€κ³  κ°€μ •ν•œλ‹€. μ² μˆ˜λŠ” 창고에 λ³΄κ΄€λœ ν† λ§ˆν† λ“€μ΄ 며칠이 μ§€λ‚˜λ©΄ λ‹€ 읡게 λ˜λŠ”μ§€, κ·Έ μ΅œμ†Œ 일수λ₯Ό μ•Œκ³  μ‹Άμ–΄ ν•œλ‹€.

ν† λ§ˆν† λ₯Ό 창고에 λ³΄κ΄€ν•˜λŠ” 격자λͺ¨μ–‘μ˜ μƒμžλ“€μ˜ 크기와 읡은 ν† λ§ˆν† λ“€κ³Ό 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ˜ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, 며칠이 μ§€λ‚˜λ©΄ ν† λ§ˆν† λ“€μ΄ λͺ¨λ‘ μ΅λŠ”μ§€, κ·Έ μ΅œμ†Œ 일수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. 단, μƒμžμ˜ 일뢀 μΉΈμ—λŠ” ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

μž…λ ₯

첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M,N이 주어진닀. M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≤ M,N ≤ 1,000 이닀. λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” ν•˜λ‚˜μ˜ μƒμžμ— μ €μž₯된 ν† λ§ˆν† λ“€μ˜ 정보가 주어진닀. 즉, λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” μƒμžμ— λ‹΄κΈ΄ ν† λ§ˆν† μ˜ 정보가 주어진닀. ν•˜λ‚˜μ˜ μ€„μ—λŠ” μƒμž κ°€λ‘œμ€„μ— λ“€μ–΄μžˆλŠ” ν† λ§ˆν† μ˜ μƒνƒœκ°€ M개의 μ •μˆ˜λ‘œ 주어진닀. μ •μˆ˜ 1은 읡은 ν† λ§ˆν† , μ •μˆ˜ 0은 읡지 μ•Šμ€ ν† λ§ˆν† , μ •μˆ˜ -1은 ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ€ 칸을 λ‚˜νƒ€λ‚Έλ‹€. 

좜λ ₯

μ—¬λŸ¬λΆ„μ€ ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡을 λ•ŒκΉŒμ§€μ˜ μ΅œμ†Œ λ‚ μ§œλ₯Ό 좜λ ₯ν•΄μ•Ό ν•œλ‹€. λ§Œμ•½, μ €μž₯될 λ•ŒλΆ€ν„° λͺ¨λ“  ν† λ§ˆν† κ°€ μ΅μ–΄μžˆλŠ” μƒνƒœμ΄λ©΄ 0을 좜λ ₯ν•΄μ•Ό ν•˜κ³ , ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ§€λŠ” λͺ»ν•˜λŠ” 상황이면 -1을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

예제 μž…λ ₯ 1

6 4
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1

예제 좜λ ₯ 1

8

예제 μž…λ ₯ 2

6 4
0 -1 0 0 0 0
-1 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1 

예제 좜λ ₯ 2

-1

예제 μž…λ ₯ 3

6 4
1 -1 0 0 0 0
0 -1 0 0 0 0
0 0 0 0 -1 0
0 0 0 0 -1 1 

예제 좜λ ₯ 3

6

예제 μž…λ ₯ 4

5 5
-1 1 0 0 0
0 -1 -1 -1 0
0 -1 -1 -1 0
0 -1 -1 -1 0
0 0 0 0 0

예제 좜λ ₯ 4

14

예제 μž…λ ₯ 5

2 2
1 -1
-1 1

예제 좜λ ₯ 5

0

 

생각

- ν† λ§ˆν† κ°€ λͺ‡μΌλ§Œμ— μ΅λŠ” 데 μ–Όλ§ˆλ‚˜ κ±Έλ¦¬λŠ” 지 κ΅¬ν•˜λŠ” λ¬Έμ œμ˜€λ‹€.

- 읡은 ν† λ§ˆν† (1)의 상,ν•˜,쒌,μš°κ°€ μƒμžμ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜μ§€ μ•ŠμœΌλ©΄μ„œ, μ•ˆμ΅μ€μƒνƒœ(0)이면 읡은 μƒνƒœλ‘œ λ°”κΎΈμ–΄μ€€λ‹€.

- μ΄λ•Œ μ•ˆμ΅μ€μƒνƒœμ˜ ν† λ§ˆν† λ₯Ό μ΅μ€μƒνƒœκ°’(1)둜 λ°”κΎΈλŠ” 것이 μ•„λ‹ˆλΌ, μ΅μ€μƒνƒœ ν† λ§ˆν†  κ°’ + 1 둜 ν•˜μ—¬ ν† λ§ˆν† λ₯Ό μ΅ν˜€κ°€λ©΄μ„œ λ‚ μ§œλ₯Ό μ„Όλ‹€.

- bfsλ₯Ό μ΄μš©ν•˜μ—¬ 큐λ₯Ό μ‚¬μš©ν•΄ μž…λ ₯λ°›μœΌλ©΄μ„œ 읡은 ν† λ§ˆν† λ₯Ό 큐에 λ„£μ–΄μ£Όμ—ˆλ‹€.

- 맨 μ²˜μŒμ— λͺ¨λ‘ ν† λ§ˆν† κ°€ 읡은 μƒνƒœ 일 경우 μ•ˆμ΅μ€ ν† λ§ˆν† (0)이 μ—†μœΌλ―€λ‘œ day의 μ΄ˆκΈ°κ°’μΈ 0이 좜λ ₯λœλ‹€.

- λͺ¨λ‘ 읡지 λͺ»ν•˜λŠ” μƒν™©μ˜ 경우(예제2번과 같은 μΌ€μ΄μŠ€) μ•ˆμ΅μ€ ν† λ§ˆν† (0)κ°€ 있으면 -1을 좜λ ₯ν•˜κ³  λ¦¬ν„΄ν•œλ‹€.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//7576. ν† λ§ˆν† 
#include <iostream>
#include <queue>
 
using namespace std;
 
int N,M;
int box[1001][1001];
queue<pair<intint> > tomato;
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
int day = 0;
void bfs(){
    while(!tomato.empty()){
        int x = tomato.front().first;
        int y = tomato.front().second;
        tomato.pop();
 
        for(int i=0; i<4; i++){
            int nx = x+dx[i];
            int ny = y+dy[i];
 
            if(nx<0||ny<0||nx>=N||ny>=M) continue;
            if(box[nx][ny]==0){
                box[nx][ny] = box[x][y] + 1;
                tomato.push(make_pair(nx,ny));
            }
        }
    }
}
int main(){
    cin >> M >> N;
    for(int i=0; i<N; i++){
        for(int j=0; j<M; j++){
            cin >> box[i][j];
            if(box[i][j]==1) tomato.push(make_pair(i, j));
        }
    }
 
    bfs();
 
    for(int i=0; i<N; i++){
        for(int j=0; j<M; j++){
            if(box[i][j]==0){
                cout << -1 << "\n";
                return 0;
            }
            if(day < box[i][j]){
                day = box[i][j];
            }
        }
    }
    cout << day-1 << "\n";
    return 0;
}
cs

 

λ°˜μ‘ν˜•
Comments