#include<stdio.h>
#include<stdlib.h>
int graph[1000001][5]; //모든 수의 상,하,좌,우에 연결돼 있는 것들을 저장하는 그래프!
int BFSvisit[1000001];
int queue[1000001] = { 0 }; //큐를 사용했습니다
int front = 1;
int rear = 1;
void BFS(int m) { //BFS~~
int temp;
while (front < rear) {
temp = queue[front];
if (graph[temp][1] == 0 && BFSvisit[temp + 1] == -1) { //탐색하는 그래프의 오른쪽에 안익은 감이 있다??
BFSvisit[temp + 1] = BFSvisit[temp] + 1;
queue[rear] = temp + 1;
rear++;
}
if (graph[temp][2] == 0 && BFSvisit[temp - 1] == -1) { //탐색하는 그래프의 왼쪽에 안익은 감이 있다??
BFSvisit[temp - 1] = BFSvisit[temp] + 1;
queue[rear] = temp - 1;
rear++;
}
if (graph[temp][3] == 0 && BFSvisit[temp - m] == -1) { //탐색하는 그래프의 위쪽에 안익은 감이 있다??
BFSvisit[temp - m] = BFSvisit[temp] + 1;
queue[rear] = temp - m;
rear++;
}
if (graph[temp][4] == 0 && BFSvisit[temp + m] == -1) { //탐색하는 그래프의 아랫쪽에 안익은 감이 있다??
BFSvisit[temp + m] = BFSvisit[temp] + 1;
queue[rear] = temp + m;
rear++;
}
front++;
}
}
int main() {
int i, j, m, n;
int flag = 0;
int** read;
int big;
read
= (int**)malloc(sizeof(int*) * (n
+ 2)); for (i = 0; i < n + 2; i++) {
read
[i
] = (int*)malloc(sizeof(int) * (m
+ 2)); }//리드 배열 생성
for (i = 0; i < 1000001; i++) {
for (j = 0; j < 5; j++) {
graph[i][j] = -1;
}
BFSvisit[i] = -1;
}//그래프,bfsvisit을 -1로 초기화 시킨다
for (i = 1; i < n + 1; i++) {//입력받기 시작
for (j = 1; j < m + 1; j++) {
scanf("%d", &read
[i
][j
]); graph[m * (i - 1) + j][0] = read[i][j];
if (read[i][j] == 1) { //1인 것이 있으면 바로 큐에 넣었어요
queue[rear] = m * (i - 1) + j;
BFSvisit[m * (i - 1) + j] = 0; //그리고 이것들의 비지트는 0으로 초기화
rear++;
}
if (read[i][j] == 0)
flag = 1; //나중에 익은 토마토가 없을때 -1을 출력하기 위해
}
}
for (i = 1; i < n + 1; i++) {
for (j = 1; j < m + 1; j++) {
graph[m * (i - 1) + j][1] = read[i][j + 1];
graph[m * (i - 1) + j][2] = read[i][j - 1];
graph[m * (i - 1) + j][3] = read[i - 1][j];
graph[m * (i - 1) + j][4] = read[i + 1][j];
}//그래프에 리드를 넣었어요
}
if (rear == 1) {
if (flag == 1)
else
return 0;
} //예외들 출력~
if (rear == n * m + 1) {
return 0;
} //여기도 예외 출력~
BFS(m); //BFS시작했습니다!
big = 0; //결과 값을 구하려고요
for (i = 1; i < n + 1; i++) {
for (j = 1; j < m + 1; j++) {
if (graph[m * (i - 1) + j][0] == 0 && BFSvisit[m * (i - 1) + j] == -1) { //격리구간이 있었을 시 -1출력후 끝
return 0;
}
if (big < BFSvisit[m * (i - 1) + j])
big = BFSvisit[m * (i - 1) + j]; //가장 큰 수를 저장했어요.
}
}
}