#include<stdio.h>
int map[1001][1001] = { -1 };
int cue[1100000] = { 0 };
void bfs(int length,int width)
{
int count = 0;
int front = 0;
int rear = 0;
int pop;
for (int i = 0; i < length; i++)
{
for (int j = 0; j < width; j++)
{
if (map[i][j] == 1)
cue[rear++] = i * width + j;
}
}
int first = rear;
while (front <= rear)
{
pop = cue[front++];
int y = pop / width;
int x = pop % width;
if (y + 1 < length && map[y + 1][x] == 0)
{
cue[rear++]=pop + width;
map[y + 1][x] = map[y][x]+1;
}
if (0 < y && map[y - 1][x] == 0)
{
cue[rear++] = pop - width;
map[y - 1][x] = map[y][x] + 1;
}
if (x + 1 < width && map[y ][x+1] == 0)
{
cue[rear++] = pop+1;
map[y][x+1] = map[y][x] + 1;
}
if (0 < x && map[y][x-1] == 0)
{
cue[rear++] = pop -1;
map[y ][x-1] = map[y][x] + 1;
}
}
}
int main()
{
int width, length;
scanf("%d %d", &width, &length);
int tomato = 0;
for (int i = 0; i < length; i++)
{
for (int j = 0; j < width; j++)
{
scanf("%d", &map[i][j]);
if (map[i][j] == 1)
tomato = 1;
}
}
bfs(length,width);
int max = 0;
int check = 0;
for (int i = 0; i < length; i++)
{
for (int j = 0; j < width; j++)
{
//printf("%d ", map[i][j]);
if (map[i][j] > max)
max = map[i][j];
if (map[i][j] == 0)
check = 1;
}
//printf("\n");
}
//printf("check: %d tomato:%d\n", check, tomato);
if (check || tomato == 0)
printf("-1");
else if (max == 0)
printf("0");
else
printf("%d", max-1);
}
오래 걸렸지만 스스로 해내서 정말 기뻤다.
스스로 bfs를 구현했다는 것이 기분이 참 좋았다.
728x90
'알고리즘 기초시절' 카테고리의 다른 글
백준 (C언어)백준2667번 단지번호 붙히기 (0) | 2023.01.04 |
---|---|
백준 2178 BFS미로탐색(C언어) (2) | 2023.01.04 |
백준 트리 1068번 DFS(C언어) (0) | 2023.01.04 |
백준 피보나치 함수 1003번 (0) | 2023.01.04 |
백준 타일채우기 문제 dp (0) | 2023.01.03 |