* 정보 올림피아드 1840번 문제입니다.
이건 if else가 난무해서 보기 안좋네요..
시간이 지날 때마다 공기랑 녹는 치즈를 맨 바깥부터 BFS 로 같은 값을 넣었습니다. 공기에 값을 넣고 나선 다시 탐색하게 하고 치즈는 값만 넣게 했습니다. 입력할 때 치즈 개수를 세서, 치즈를 녹일 때마다 카운트해서 종료 조건으로 사용했습니다.
#include <stdio.h>
#define MAX_N 101
typedef struct _point
{
int x;
int y;
} point;
typedef struct _queue
{
int top;
int bottom;
point data[MAX_N * MAX_N];
} queue;
int x_size, y_size, cheese_count, melt_count;
int cheese[MAX_N][MAX_N];
queue melt_queue;
void enqueue(int x, int y)
{
melt_queue.data[melt_queue.bottom].x = x;
melt_queue.data[melt_queue.bottom].y = y;
melt_queue.bottom++;
if(melt_queue.bottom == MAX_N * MAX_N)
{
melt_queue.bottom = 0;
}
}
point dequeue()
{
point ret = { -1, -1 };
int next_top = melt_queue.top + 1;
if(next_top == MAX_N * MAX_N)
{
next_top = 0;
}
if(next_top != melt_queue.bottom)
{
ret = melt_queue.data[next_top];
melt_queue.top = next_top;
}
return ret;
}
int main()
{
FILE *fin = fopen("input.txt", "r"), *fout = fopen("output.txt", "w");
int i, j, prev_cheese_count = 0;
point melt_point;
fscanf(fin, "%d %d", &y_size, &x_size);
for(i = 1 ; i <= y_size ; i++)
{
for(j = 1 ; j <= x_size ; j++)
{
fscanf(fin, "%d", &cheese[i][j]);
if(cheese[i][j])
{
cheese_count++;
}
}
}
melt_queue.bottom = 1;
for(i = 1 ; cheese_count > 0 ; i++, melt_count++)
{
prev_cheese_count = cheese_count;
cheese[1][1] = -i;
enqueue(1, 1);
while(melt_point = dequeue(), melt_point.x != -1)
{
if(melt_point.x > 1 && cheese[melt_point.y][melt_point.x - 1] != -i)
{
if(cheese[melt_point.y][melt_point.x - 1] == 1)
{
cheese_count--;
}
else
{
enqueue(melt_point.x - 1, melt_point.y);
}
cheese[melt_point.y][melt_point.x - 1] = -i;
}
if(melt_point.x < x_size && cheese[melt_point.y][melt_point.x + 1] != -i)
{
if(cheese[melt_point.y][melt_point.x + 1] == 1)
{
cheese_count--;
}
else
{
enqueue(melt_point.x + 1, melt_point.y);
}
cheese[melt_point.y][melt_point.x + 1] = -i;
}
if(melt_point.y > 1 && cheese[melt_point.y - 1][melt_point.x] != -i)
{
if(cheese[melt_point.y - 1][melt_point.x] == 1)
{
cheese_count--;
}
else
{
enqueue(melt_point.x, melt_point.y - 1);
}
cheese[melt_point.y - 1][melt_point.x] = -i;
}
if(melt_point.y < y_size && cheese[melt_point.y + 1][melt_point.x] != -i)
{
if(cheese[melt_point.y + 1][melt_point.x] == 1)
{
cheese_count--;
}
else
{
enqueue(melt_point.x, melt_point.y + 1);
}
cheese[melt_point.y + 1][melt_point.x] = -i;
}
}
}
fprintf(fout, "%d\n%d", melt_count, prev_cheese_count);
fclose(fin);
fclose(fout);
return 0;
}