7576 토마토 문제와 거의 유사하지만 전에 문제는 2차원 배열, 이번 문제는 3차원 배열로 풀어야한다는 점에서 다르다.
전에 코드에 비해 나아진 점을 찾아보자면!
1. graph 값을 저장하면서 동시에 익은 토마토가 있는 경우에 바로 queue에 저장해뒀고
2. 몇번째 날에 익었는지를 새로운 배열로 선언하지 않고 queue 배열을 [][4]로 지정하여 0에는 z, 1에서 y, 2에는 x, 3에는 익은 날짜를 저장함으로써 가독성을 높였다.
3. 익은 토마토 개수와 토마토가 없는 자리의 개수를 따로 구함으로써 예외인 경우를 처리해줬다.
주의해야할 점을 찾아보자면!
3차원 문제이기때문에 Z,Y,X 순서를 헷갈리지 않아야하고 맨 마지막에 bfs()함수에서 return 할때 queue[rear][3]에는 아무런 값도 저장하고 있지 않기 때문에 rear-1 값을 return 해야한다. 또한 rear와 front를 언제 ++해야하는지, 위치를 주의해야한다.
그리고 하나 문제와 상관없이 안 것은 int main() 함수에서 return 할때 그값이 0 이상이어야 한다는 것이다!
밑에는 7576 문제 풀이다!
https://donggul-godsang.tistory.com/38
이 밑에는 이번 문제 코드이다!!
#include <stdio.h>
int arr[101][101][101]; //z,y,x 순
int visit[101][101][101];
int queue[10000001][4];
int front=1,rear=1;
int x_coordinate[6]={0,0,0,0,1,-1};
int y_coordinate[6]={0,0,1,-1,0,0};
int z_coordinate[6]={1,-1,0,0,0,0};
int bfs(int x_max,int y_max,int z_max,int *yes_tomato)
{
int nx,ny,nz;
while(front<rear)
{
for(int i=0;i<6;i++)
{
nz=queue[front][0]+z_coordinate[i];
ny=queue[front][1]+y_coordinate[i];
nx=queue[front][2]+x_coordinate[i];
if(nx>x_max||nx<1||ny>y_max||ny<1||nz>z_max||nz<1) //범위를 벗어날때
continue;
if(arr[nz][ny][nx]==-1 || visit[nz][ny][nx]==1) //토마토가 없거나 이미 지나감
continue;
// printf("emfdjdjd");
visit[nz][ny][nx]=1;
*yes_tomato=*yes_tomato+1;
queue[rear][0]=nz;
queue[rear][1]=ny;
queue[rear][2]=nx;
queue[rear][3]=queue[front][3]+1;
rear++;
}
front++;
//printf("오잉: %d\n",*yes_tomato);
if(front==rear)
return queue[rear-1][3]; //맨 마지막에는 queue[rear][]이 아무값도 저장되지 않는 값임!
}
}
int main(void)
{
int x,y,z,day,not_tomato=0,yes_tomato=0;
scanf("%d %d %d",&x,&y,&z);
for(int k=1;k<=z;k++)
{
for(int j=1;j<=y;j++)
{
for(int i=1;i<=x;i++)
{
scanf("%d",&arr[k][j][i]);
if(arr[k][j][i]==1)
{
queue[rear][0]=k;
queue[rear][1]=j;
queue[rear][2]=i;
queue[rear][3]=0;
rear++; //먼저 저장하고 rear++를 해줘야함 아직 처음에 안넣어줬기 때문에
visit[k][j][i]=1;
yes_tomato++;
}
if(arr[k][j][i]==-1)
not_tomato++;
}
}
}
if(not_tomato+yes_tomato==x*y*z)
{
printf("0");
return 0;
}
day=bfs(x,y,z,&yes_tomato);
//printf("yestomato! : %d\n",yes_tomato);
if(yes_tomato+not_tomato==x*y*z)
printf("%d",day);
else
printf("-1");
}
'알고리즘! > Graph' 카테고리의 다른 글
[C] 14940: 쉬운 최단거리 (0) | 2023.08.21 |
---|---|
[C] 11724: 연결 요소의 개수 (0) | 2023.08.06 |
[C] 1389: 케빈 베이컨의 6단계 법칙 (0) | 2023.08.03 |
[C] 10026: 적록색약 (0) | 2023.07.30 |
[C] 7576: 토마토 (0) | 2023.07.30 |