본문 바로가기

1p1d

[Day 4] 백준 7569 : 토마토

해법 : 3차원 bfs

정보올림피아드 2013 초등본선 3번 문제인데

이 당시에 본선에서 문제를 풀 때.. 그냥 배열로 3차원을 구현할 수 있을지 몰랐어서.. 당황했던 기억이 난다.

사실 그냥 2차원에서처럼 3차원에 적용해서 풀어주면 된다. 

유의할 점은 for 문을 작성할 때 행, 열, 차원 순서가 아니라 차원, 열, 행 순서로 작성해야 한다는 점 정도 인듯.

 

 

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int n,m,h;
int A[105][105][105];
int vt[105][105][105];
struct tuple2 {
    int x,y,z;
    int val;
};
vector <tuple2> que;
int r,f;
int ans;
int _x[6]={0,0,0,0,1,-1};
int _y[6]={0,0,1,-1,0,0};
int _z[6]={1,-1,0,0,0,0};
void bfs() {
    tuple2 srg,srg2;
    int X,Y,Z,i;
    do {
        srg=que[f++];
        ans=max(ans,srg.val);
        for(i=0;i<6;i++) {
            X=srg.x+_x[i];
            Y=srg.y+_y[i];
            Z=srg.z+_z[i];
            if(X<0 || X>=h || Y<0 || Y>=m || Z<0 || Z>=n) continue;
            if(A[X][Y][Z]==0 && vt[X][Y][Z]==0) {
                srg2.x=X;
                srg2.y=Y;
                srg2.z=Z;
                srg2.val=srg.val+1;
                vt[X][Y][Z]=1;
                A[X][Y][Z]=1;
                r++;
                que.push_back(srg2);
            }
        }
    } while(r>f);
    int flag=0;
    int j,k;
    for(i=0;i<h;i++) {
        for(j=0;j<m;j++) {
            for(k=0;k<n;k++) {
                if(A[i][j][k]==0) {
                    flag=1;
                    break;
                }
            }
        }
    }
    if(flag==1) printf("-1\n");
    else printf("%d\n",ans);
}
int main() {
    //freopen("input.txt","r",stdin);
    scanf("%d %d %d",&n,&m,&h);
    int i,j,k;
    int flag=0;
    tuple2 srg;
    for(i=0;i<h;i++) {
        for(j=0;j<m;j++) {
            for(k=0;k<n;k++) {
                scanf("%d",&A[i][j][k]);
                if(A[i][j][k]==0) flag=1;
                if(A[i][j][k]==1) {
                    vt[i][j][k]=1;
                    srg.x=i;
                    srg.y=j;
                    srg.z=k;
                    srg.val=0;
                    r++;
                    que.push_back(srg);
                }
            }
        }
    }
    if(flag==0) printf("0\n");
    else bfs();
    return 0;
}

'1p1d' 카테고리의 다른 글

[Day 4] 백준 9663 : N-queen  (0) 2021.01.24
[Day 3] 백준 2589 : 보물섬  (0) 2021.01.24
Schedule  (0) 2021.01.23
[Day 1] 백준 1753 : 최단경로  (0) 2021.01.22
[Day 1] 백준 1937 : 욕심쟁이 판다  (0) 2021.01.22