티스토리 뷰

Coding/acmicpc

백준 7576:토마토

이끼대백과 2018. 4. 16. 15:21

백준 7576번 토마토 문제입니다. 이번문제는 DFS로는 접근하기 어려운 문제인 것 같아요. 혹시 DFS로 푸신분이 있으시다면 댓글로.. 알려주세요! 이번문제도 다른 탐색문제들과 다른것은 많이 없습니다. -1이 탐색 불가능한점(바다문제라면 바다에 해당되겠네요)으로 설정 후 탐색해 주시면 됩니다. 또한 다른 문제들은 시작점이 하나지만 이문제는 시작점이 여러개가 될 수 있는 문제입니다. 따라서 큐에 시작점을 삽입할때 1로 표시된 시작점들을 모두 넣어주어야 해요!! 그럼 컴퓨터가 알아서.. 다해줍니다^^.

밑에는 제 코드입니다.

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
#include <iostream>
#include <vector>
#include <queue>
 
using namespace std;
 
int r[4= { 0,-1,0,1 };
int c[4= { -1,0,1,0 };
 
typedef struct rc {
    int r;
    int c;
}pos;
 
int N, M, Count;
 
vector<vector<int> > tomato;
 
bool isSafe(pos p) {
    if (p.r<0 || p.r>- 1 || p.c<0 || p.c>- 1return false;
    else return true;//범위 벗어나는지 체크
}
 
void bfs(vector<pos>& start) {
    queue<pos> q;
    for (int i = 0; i < start.size(); i++) {
        q.push(start[i]);//시작점을 모두 큐에 삽입
    }
    while (!q.empty()) {
        pos cur = q.front();
        for (int i = 0; i < 4; i++) {//탐색
            pos next = { cur.r + r[i],cur.c + c[i] };
            if (isSafe(next) && !tomato[next.r][next.c]) {
                q.push(next);//조건에 맞으면 큐에 삽입
                tomato[next.r][next.c] = tomato[cur.r][cur.c] + 1;
            }
        }
        q.pop();
    }
}
 
int check() {
    int max = 1;
    for (int r = 0; r < N; r++) {
        for (int c = 0; c < M; c++) {
            if (tomato[r][c] == 0) {
                return -1;//익지 않은 토마토 발견시 -1리턴
            }
            else if (tomato[r][c] > max) {
                max = tomato[r][c];//최댓값 찾기
            }
        }
    }
    return max;
}
 
int main(void) {
    cin >> M >> N; vector<pos> start; pos s;
    tomato.resize(N);
    for (int r = 0; r < N; r++) {
        tomato[r].resize(M);
        for (int c = 0; c < M; c++) {
            cin >> tomato[r][c];
            if (tomato[r][c] == 1) {//1이라면
                s.r = r; s.c = c;//시작점에 저장
                start.push_back(s);
            }
        }
    }
 
    bfs(start);//탐색 후
 
    int cnt = check();//몇 일 걸리는지
    if (cnt == -1cout << "-1" << endl;
    else cout << cnt - 1 << endl;
 
    return 0;
}
cs


'Coding > acmicpc' 카테고리의 다른 글

백준 2146:다리 만들기  (0) 2018.04.19
백준 5014:스타트링크  (0) 2018.04.16
백준 6593:상범 빌딩  (0) 2018.04.16
백준 12851, 13549, 13913:숨바꼭질 시리즈.. feat.순간이동  (8) 2018.04.03
백준 9663:숨바꼭질  (0) 2018.03.26
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/01   »
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
글 보관함