SDJ( 수돈재 아님 ㅎ )

[C++] 7576 - 토마토 본문

알고리즘/Backjoon

[C++] 7576 - 토마토

ShinDongJun 2020. 1. 20. 18:30

문제 링크 : https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토들의 정보가 주어진다. 즉, 둘째 줄부터 N개의 줄에는 상자에 담긴 토마토의 정보가 주어진다. 하나의 줄에는 상자 가로줄에 들어있는 토마토의 상태가 M개의 정수로 주어진다. 정수 1은 익은 토마토, 정수 0은 익지 않은 토마토, 정수 -1은 토마

www.acmicpc.net

 

토마토가 들어있는 칸을 먼저 기본 Queue에 넣어주고 나서

그 칸부터 상하좌우에 빈 공간이 있으면 그 공간에 값을 넣어주고 그 좌표를 또다시 Queue에 넣어 

반복하도록 만들었다.

 

모든 탐색이 끝나고 배열 안에 0이 존재한다면 그것은 토마토가 전부 익지 못하는 상황이므로 -1을 출력하고

만약 0이 없다면 최댓값에서 1을 뺀 값을 출력했다.

 

입력을 받을때 모든 칸이 -1일 경우?에는 토마토가 없는 상황인지라 0을 출력해야할지 -1을 출력해야할지 고민을 하다고 그냥 0을 출력하도록 했다.

 

 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
 
typedef pair<intint> pii;
 
queue<pii> q;
 
int B[1005][1005];
int N, M;
 
void BFS()
{
    int X[4= {001-1};
    int Y[4= {1-100};
 
    while(!q.empty())
    {
        pii p = q.front();
        q.pop();
        for(int i = 0; i < 4++i)
        {
            int NX = p.second + X[i];
            int NY = p.first+ Y[i];
 
            if(0 <= NY && NY < N && 0 <= NX && NX < M)
            {
                if(B[NY][NX] != -1 && !B[NY][NX])
                {
                    B[NY][NX] = B[p.first][p.second] + 1;
                    q.push(pii(NY, NX));
                }
            }
        }
    }
}
 
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> M >> N;
 
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < M; ++j)
        {
            cin >> B[i][j];
            if(B[i][j] == 1)
                q.push(pii(i,j));
        }
    }
    if(!q.empty())
        BFS();
    else
    {
        cout << -1 << endl;
        return 0;
    }
 
    int MAX = 0;
    int flag = 0;
 
    for(int i = 0;!flag && i < N; ++i)
    {
        for(int j = 0;!flag && j < M; ++j)
        {
            if(B[i][j] == 0)
                flag = 1;
            if(MAX < B[i][j])
                MAX = B[i][j];
        }
    }
 
    if(flag)
        cout << -1 << endl;
    else if(MAX == 0)
        cout << 0 << endl;
    else
        cout << MAX-1 << endl;
 
    return 0;
}

'알고리즘 > Backjoon' 카테고리의 다른 글

[C++] 2606 - 바이러스  (0) 2020.01.20
[C++] 1593 - 문자 해독  (0) 2020.01.20
[C++] 1260 - DFS와 BFS  (0) 2020.01.20
[C++] Mini Sudoku X  (0) 2020.01.20
[C++] 15918 - 랭퍼든 수열쟁이야!!  (0) 2020.01.20
Comments