[백준] 7576 7569 토마토(C++)

2022. 4. 27. 05:14·Algorithm/Solution
728x90

7576번: 토마토 (acmicpc.net)

 

7576번: 토마토

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

www.acmicpc.net

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


난이도 : 골드 5

 

해결 방법 :

 

굉장히 오래 걸렸던 문제.... 

일단 배열 입력자체가 보통은 가로, 세로 를 주는데 세로 가로 수를 줘서 

반대로 입력을 해주면 좀더 편하게 풀 수 있다. (이것도 시간 오지게 잡아먹힘 헷갈려서)

 

뭐튼 bfs로 푸는문제인데 처음에 접근을 잘못해서 연결요소의 개수로 접근해 풀었다가 1시간 날렸다

이제 토마토배열에 1인 값이 있는걸 큐에 삽입을 해서 1을 기준으로 bfs를 돌려줘야 함

그래서 배열의 데이터를 입력을 받을 때 미리 1인 아이들을 큐에 삽입 해주면 됨

 

그래서 bfs 돌려서 최단거리구하는 방식으로 해주고

만약에 배열중에 0인 아이가 있다면 다 1로 못만들었다는 뜻이니까 -1을 출력해주면됨

그리고 최단거리는 1부터 시작해서 거리가 +1된 값이 되므로 출력할때만 -1 해주면됨

 

코드 :

 

#include <iostream>
#include <algorithm> 
#include <queue>
#include <vector>
using namespace std;

int n, m, arr[1001][1001], ans = -1;
int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };

queue<pair<int, int>> q;

void bfs() {
    while (!q.empty()) {
        int xx=  q.front().first;
        int yy = q.front().second;
        q.pop();
        for (int i = 0; i < 4; i++) {
            int nx = xx + dx[i];
            int ny = yy + dy[i];
            if (ny >= 0 && nx >= 0 && nx < n && ny < m && arr[nx][ny] == 0) {
                arr[nx][ny] = arr[xx][yy] + 1;
                q.push(make_pair(nx, ny));                  
            }
        }
    }
}


int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(nullptr);

    cin >> m >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> arr[i][j];
            if (arr[i][j] == 1) {
                q.push(make_pair(i, j));
            }
        }
    }

    bfs();

	// 이해를 돕기위한 arr배열 출력 코드 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
           cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (arr[i][j] == 0) {
                cout << -1;
                return 0;
            }else {
                ans = max(arr[i][j], ans);
            }
        }
    }

    cout << ans-1;

}

 

 

7569는 기존 토마토 문제에서 z축이 추가된 것이므로, 입력이랑 저장하는 걸 좀만 다르게 해주면 된다.

dz배열을 추가해주고, 3차원 배열로 선언, 큐는 다중페어를 이용하여 선언했다.

#include <iostream>
#include <vector>
#include <queue>

using namespace std;


int m, n, h, ans, dist[102][102][102];
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<pair<pair<int,int>, int>> q;

void bfs(){
    while(!q.empty()){
        int xx = q.front().first.first;
        int yy = q.front().first.second;
        int zz = q.front().second;
        q.pop();
        for(int i=0;i<6;i++){
            int nx = xx+dx[i];
            int ny = yy+dy[i];
            int nz = zz+dz[i];
            
            if(nx>=0&&ny>=0&&nz>=0&&nx<n&&ny<m&&nz<h&&dist[nx][ny][nz] == 0){
                dist[nx][ny][nz] = dist[xx][yy][zz] + 1;
                q.push(make_pair(make_pair(nx,ny),nz));
            }
        }
    }
    
}
int main()
{
    cin >> m >> n >> h;
    for(int k=0;k<h;k++){
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin >> dist[i][j][k];
                if(dist[i][j][k] == 1){
                    q.push(make_pair(make_pair(i,j),k));
                }
            }
        }
    }
    
    bfs();
    
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            for(int k=0;k<h;k++){
                if (dist[i][j][k] == 0) {
                    cout << -1;
                    return 0;
                }else {
                    ans = max(dist[i][j][k], ans);
                }
            }
            
        }
    }

    cout << ans-1;

    return 0;
}

 

 

728x90
저작자표시 비영리 (새창열림)

'Algorithm > Solution' 카테고리의 다른 글

[백준] 2589번 보물섬 (C++)  (0) 2022.05.08
[백준] 1946 신입사원(C++)  (0) 2022.05.03
[백준] 8979 올림픽 C++ 코드  (0) 2022.03.17
[백준] 11140번 - LOL(C++)  (0) 2021.09.28
[프로그래머스] 문자열 다루기 기본  (0) 2021.08.26
'Algorithm/Solution' 카테고리의 다른 글
  • [백준] 2589번 보물섬 (C++)
  • [백준] 1946 신입사원(C++)
  • [백준] 8979 올림픽 C++ 코드
  • [백준] 11140번 - LOL(C++)
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (253)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (65)
        • Article (11)
        • Study (35)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    파일처리
    데브코스
    자료구조
    백준
    프로그래머스
    lisp
    Algorithm
    리팩토링
    C++
    react
  • hELLO· Designed By정상우.v4.10.2
BeNI
[백준] 7576 7569 토마토(C++)
상단으로

티스토리툴바