#include<stdio.h>
typedef struct rque_
{
int x,y;
} rque;
rque que[10000]= {},data;//,que2[10000]= {}
int f=0,r=0,n,m;//f2=0,//r2=0
int warehouse[1000][1000]= {},vst[1000][1000]= {};
enq(int x,int y)
{
que[r].x=x;
que[r++].y=y;
}
void deq()
{
int i,q,j;
q=r-f;
// printf("%d",r);
for(i=0; i<q; i++)
{
que[++f];
data=que[f];
warehouse[data.x][data.y]=1;
vst[data.x][data.y]=1;
if(data.x!=0 && data.y!=0)
{
if(data.y+1<m && warehouse[data.x][data.y+1]==0 && vst[data.x][data.y+1]==0 )
{
enq(data.x,data.y+1);
//vst[data.x+1][data.y]=1;
}
if(data.y-1>=0 && warehouse[data.x][data.y-1]==0 && vst[data.x][data.y-1]==0)
{
enq(data.x,data.y-1);
//vst[data.x][data.y-1]=1;
}
if( data.x+1<n && warehouse[data.x+1][data.y]==0 && vst[data.x+1][data.y]==0)
{
enq(data.x+1,data.y);
//vst[data.x+1][data.y]=1;
}
if(data.x-1>=0 && warehouse[data.x-1][data.y]==0 && vst[data.x-1][data.y]==0)
{
enq(data.x-1,data.y);
// vst[data.x-1][data.y]=1;
}
}
}
printf("\n");
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
printf("%2d ",warehouse[i][j]);
printf("\n");
}
}
int main()
{
int i,j,nv=1,day=0,l=0,a,b,enqc=0;
scanf("%d %d",&m,&n);
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
scanf("%d",&warehouse[i][j]);
}
}
for(i=0; i<n; i++)
for(j=0; j<m; j++)
if(warehouse[i][j]==1)
{
enqc++;
enq(i,j);
vst[i][j]=1;
}
printf("%d",enqc);
while(f!=r)
{
if(f==r)
break;
else
{
deq();
day++;
}
}
//printf("%d",day);
/*
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
printf("%d ",warehouse[i][j]);
printf("\n");
}*/
/*
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
if(warehouse[i][j]==0)
{
printf("-1");
return 0;
}
}
}
*/
printf("%d",day-1);
}




두 코드 모두 한 번씩 읽어 보고, 다시 코드 작성해보세요!
#include <stdio.h>
#define MAX 1000
typedef struct Queue {
int x;
int y;
int size;
} Queue;
int front = -1, rear = -1;
Queue Q[MAX * MAX];
int Map[MAX][MAX];
int Visited[MAX][MAX];
int px[] = {-1, 1, 0, 0};
int py[] = {0, 0, -1, 1};
int BFS (int maxY, int maxX) {
// 탐색 시작
while (front < rear) {
// 큐에서 꺼내기
front++;
int x = Q[front].x;
int y = Q[front].y;
int size = Q[front].size;
// 왼, 오, 위, 아 체크
for (int i = 0; i < 4; i++) {
int nx = px[i] + x;
int ny = py[i] + y;
// 유효한 좌표인지 체크
if (nx < 0 || nx >= maxX || ny < 0 || ny >= maxY) {
continue;
}
// 체크하지 않았고, 익지 않았다면 체크 리스트에 추가
if (Map[ny][nx] == 0 && !Visited[ny][nx]) {
// 다음 탐색로에 등록
rear++;
Q[rear].x = nx;
Q[rear].y = ny;
Q[rear].size = size + 1;
// 익은놈 체크
Map[ny][nx] = 1;
// 방문 표시
Visited[ny][nx] = 1;
}
}
}
return Q[rear].size;
}
int main(void) {
int N = 0, M = 0;
int Empty = 0, Tomato = 0, maxCount = 0;
scanf("%d %d", &M, &N);
// 박스에 토마토 담기
for (int y = 0; y < N; y++) {
for (int x = 0; x < M; x++) {
int InputBox = -1;
scanf("%d", &InputBox);
// 빈 공간일 경우, Empty 카운터 + 1
if (InputBox == -1) {
Empty++;
} else if (InputBox == 1) {
Tomato++;
}
Map[y][x] = InputBox;
}
}
// 박스의 최대 공간 - Empty와 모두 익은 토마토의 갯수가 같으면 1 출력하고 종료
if ((M * N) - 1 == Tomato) {
printf("0\n");
return 0;
}
// 한쪽에만 익은 토마토가 있으라는 보장이 없다.
for (int y = 0; y < N; y++) {
for (int x = 0; x < M; x++) {
// 익은 토마토는 모두 큐에 넣는다.
if (Map[y][x] == 1) {
rear++;
Q[rear].x = x;
Q[rear].y = y;
Q[rear].size = 0;
// 방문 표시
Visited[y][x] = 1;
}
}
}
// 탐색 시작
maxCount = BFS(N, M);
// 안익은 토마토가 있는지 확인
for (int y = 0; y < N; y++) {
for (int x = 0; x < M; x++) {
// 익은 토마토이고, 체크하지 않았다면 진행
if (Map[y][x] == 0) {
maxCount = -1;
break;
}
}
}
printf("%d\n", maxCount);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int map[1001][1001] = {0};
int queue[10000000][2] = {0};
int front = 0, rear = 0;
int x, y, k;
void diffuse() {
int max = front-1;
for(int i = rear; i <= max; i++) {
int a = queue[i][0];
int b = queue[i][1];
if(map[a-1][b] == 0 && a-1 >= 0) {
queue[front][0] = a-1;
queue[front][1] = b;
map[a-1][b] = 1;
front++;
}
if(map[a+1][b] == 0 && a+1 < y) {
queue[front][0]=a+1;
queue[front][1]=b;
map[a+1][b] = 1;
front++;
}
if(map[a][b-1] == 0 && b-1 >= 0) {
queue[front][0] = a;
queue[front][1] = b-1;
map[a][b-1] = 1;
front++;
}
if(map[a][b+1] == 0 && b+1 < x) {
queue[front][0] = a;
queue[front][1] = b+1;
map[a][b+1] = 1;
front++;
}
rear++;
}
}
void func() {
while(1) {
if(front != rear) {
diffuse();
k++;
}
else {
return;
}
}
}
int main()
{
scanf("%d %d", &x, &y);
for(int i = 0; i < y; i++) {
for(int j = 0; j < x; j++) {
scanf("%d", &map[i][j]);
}
}
for(int i = 0; i < y; i++) {
for(int j = 0; j < x; j++) {
if(map[i][j] == 1) {
queue[front][0] = i;
queue[front][1] = j;
front++;
}
}
}
k = 0;
func();
for(int i = 0; i < y; i++) {
for(int j = 0; j < x; j++) {
if(map[i][j] == 0) {
printf("-1");
return 0;
}
}
}
printf("%d", k-1);
return 0;
}