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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
| #include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int g[1000][1000];
int M;
int N;
int BFS();
pair<int, int> temp;
queue < pair<int,int> > q;
int main(void) {
memset(g, 0, sizeof g);
bool check_allzero = true; // 입력값이 모두 0인경우 확인용
bool check_allone = true; // 입력값이 모두 1또는 -1인 경우 확인용
bool check_zero = false;
int n1, n2, min;
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
scanf("%d %d\n", &n1,&n2);
N = n1; M = n2;
for (int i = 0; i < n2; i++) {
for (int j = 0; j < n1; j++) {
scanf("%d ", &g[i][j]);
if (g[i][j] == 1 || g[i][j] == -1)
check_allzero = false;
else
check_allone = false;
}
}
if (check_allone == true) {
printf("%d\n", 0);
return 0;
}
if (check_allzero == true) {
printf("%d\n", -1);
return 0;
}
for (int i = 0; i < n2; i++) {
for (int j = 0; j < n1; j++) {
if (g[i][j] == 1)
q.push(pair<int,int>(i,j));
}
}
printf("%d\n",BFS());
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
int BFS() {
pair<int, int> temp;
while (!q.empty()) {
temp = q.front();
q.pop();
if (temp.first > 0 && g[temp.first - 1][temp.second] == 0) { ?// 위쪽에 안익는 토마토가 있으면, 현재 값의 +1로 할당
//현재 값의 +1로 할당해주는 이유는 같은 값으로 할당해버리면 그 토마토를 접근했을때 그 토마토가 또 주변의 토마토를 익게 만들기 때문입니다.
g[temp.first - 1][temp.second] = g[temp.first][temp.second] + 1;
q.push(pair<int, int>(temp.first - 1, temp.second));
}
if (temp.first < M - 1 && g[temp.first + 1][temp.second] == 0) { ?// 아래쪽에 안익는 토마토가 있으면, 현재 값의 +1로 할당
g[temp.first + 1][temp.second] = g[temp.first][temp.second] + 1;
q.push(pair<int, int>(temp.first + 1, temp.second));
}
if (temp.second > 0 && g[temp.first][temp.second - 1] == 0) { // 왼쪽에 안익는 토마토가 있으면, 현재 값의 +1로 할당
g[temp.first][temp.second - 1] = g[temp.first][temp.second] + 1;
q.push(pair<int, int>(temp.first, temp.second-1));
}
if (temp.second < N - 1 && g[temp.first][temp.second + 1] == 0) { // 오른쪽에 안익는 토마토가 있으면, 현재 값의 +1로 할당
g[temp.first][temp.second + 1] = g[temp.first][temp.second] + 1;
q.push(pair<int, int>(temp.first, temp.second+1));
}
}
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (g[i][j] == 0)
return -1;
}
}
return g[temp.first][temp.second]-1;
}
|