티스토리 뷰

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
#include <cstdio>
#include <queue>
using namespace std;
 
int main() {
    int M, N, max = 1, num = 0;
    scanf("%d %d"&M, &N);
    int** field = new int* [N];
    queue<pair<intint>> bfs;
    for (int i = 0; i < N; i++)
        field[i] = new int[M] {0, };
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            scanf("%d"&field[i][j]);
 
            if (field[i][j] == 1) {
                bfs.push(make_pair(i, j));
                num++;
            }
            else if (field[i][j] == -1)
                num++;
        }
    }
    while (!bfs.empty()) {
        pair<intint> val = bfs.front();
        bfs.pop();
 
        int next = field[val.first][val.second] + 1;
 
        if (val.first - 1 >= 0 && field[val.first - 1][val.second] == 0) {
            field[val.first - 1][val.second] = next;
            bfs.push(make_pair(val.first - 1, val.second));
            num++; max = next;
        }
        if (val.second + 1 < M && field[val.first][val.second + 1== 0) {
            field[val.first][val.second + 1= next;
            bfs.push(make_pair(val.first, val.second + 1));
            num++; max = next;
        }
        if (val.first + 1 < N && field[val.first + 1][val.second] == 0) {
            field[val.first + 1][val.second] = next;
            bfs.push(make_pair(val.first + 1, val.second));
            num++; max = next;
        }
        if (val.second - 1 >= 0 && field[val.first][val.second - 1== 0) {
            field[val.first][val.second - 1= next;
            bfs.push(make_pair(val.first, val.second - 1));
            num++; max = next;
        }
    }
    printf("%d\n", num == N * M ? max - 1 : -1);
}
cs
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함