티스토리 뷰

반응형

https://www.acmicpc.net/problem/7569

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net


⊙ 문제

⊙ 입력

⊙ 출력

⊙ 예제 입출력

⊙ 알고리즘 분류

  • 그래프 이론
  • 그래프 탐색
  • 너비 우선 탐색

 


 

⊙ 문제 접근 과정

 

https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

위 문제와 똑같은 문제이다. 차이점이라곤 2차원 배열, 이 문제는 3차원 배열. 이거 하나뿐.

 

tuple을 사용하여 문제를 풀었다.


 

⊙ 문제 풀이

 

#include <iostream>
#include <queue>
#include <tuple>

using namespace std;
#define MAX 102

int M,N,H;
int days=0;
int tomato=0;
bool flag=false;
int arr[MAX][MAX][MAX];
bool visited[MAX][MAX][MAX];
int dx[] = {0,0,1,-1,0,0};
int dy[] = {1,-1,0,0,0,0};
int dz[] = {0,0,0,0,1,-1};
queue<tuple<int,int,int>> q;

int main() {
    cin >> M >> N >> H;

    for(int i=0;i<H;i++) {
        for(int j=0;j<N;j++) {
            for(int k=0;k<M;k++) {
                cin >> arr[i][j][k];

                if(arr[i][j][k]==0) tomato++;
                if(arr[i][j][k]==1) {
                    q.push({i,j,k});
                    visited[i][j][k]=true;
                }
            }
        }
    }

    if(tomato==0) {
        cout << tomato;
        return 0;
    }

    while(!q.empty()) {
        int size = q.size();

        for(int i=0;i<size;i++) {
            int a = get<0>(q.front());
            int b = get<1>(q.front());
            int c = get<2>(q.front());
            q.pop();
            for(int i=0;i<6;i++) {
                int na = a +dx[i];
                int nb = b +dy[i];
                int nc = c +dz[i];
                if(na>=0 && nb >=0 && nc>=0 && H>na && N>nb && M>nc && !visited[na][nb][nc] && arr[na][nb][nc]==0) {
                    q.push({na,nb,nc});
                    visited[na][nb][nc]=visited[a][b][c]+1;
                    tomato--;
                }
            }
        }
        days++;
    }

    if(tomato>0) {
        cout <<-1;
    } else {
        cout <<days-1;
    }
}
    

⊙ 결과

 


⊙ 마무리

 

 

3차원 배열이 처음이라 살짝 쫄았지만 2차원 배열과 다를 게 없었다.

 

 

좋아요는 로그인하지 않아도 누를 수 있습니다!

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함