[백준 2638번] 치즈

2022. 1. 17. 22:36·알고리즘 문제풀이/백준
반응형

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

 

2638번: 치즈

첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로

www.acmicpc.net

<문제 풀이> BFS

1. BFS로 (0,0)에서 공기를 출발시킨다.

2. 공기가 치즈를 2번 터치하는지 체크하고 만약 2번 터치를 했다면 임시 큐에 치즈가 녹을 자리를 넣어준다

3. 공기 BFS에 큐가 모두 비게 되면 임시 큐에 저장했던 치즈가 녹은 자리를 다시 공기 큐에 넣어준다

-> 치즈가 녹은 자리는 다시 공기가 채워지므로 공기의 다음 시작 위치가 됨

 

<C++ 소스 코드>

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
#include <iostream>
#include <utility>
#include <queue>
using namespace std;
 
#define X first
#define Y second
 
int N, M;
int board[100][100];
bool visited[100][100];
int hour[100][100];
const int dx[4] = { 0, 0, 1, -1 };
const int dy[4] = { 1, -1, 0, 0 };
 
void bfs() {
    int res = 0;
    queue<pair<int, int> >Q;
    Q.push({ 0, 0 });
    visited[0][0] = true;
    while (true) {
        queue<pair<int, int> > temp; //치즈가 녹은 자리에서 공기 BFS 시작
        while (!Q.empty()) {
            auto cur = Q.front(); Q.pop();
            for (int dir = 0; dir < 4; dir++) {
                int nx = cur.X + dx[dir];
                int ny = cur.Y + dy[dir];
                if (nx < 0 || ny < 0 || nx >= N || ny >= M)continue;
                if (board[nx][ny] == 1) {
                    if (visited[nx][ny]) { //공기가 치즈를 2번 터치하면
                        temp.push({ nx,ny });
                        board[nx][ny] = 0;
                        hour[nx][ny] = hour[cur.X][cur.Y] + 1;
 
                    }
                    else {
                        visited[nx][ny] = true;
                    }
                }
                else {
                    if (!visited[nx][ny]) {
                        Q.push({ nx, ny });
                        visited[nx][ny] = true;
                    }
                }
 
            }
        }
        if (temp.size() == 0) { //더이상 남아있는 치즈가 없는 경우
            cout << res;
            return;
        }
        res++;
        while (!temp.empty()) {
            Q.push(temp.front()); temp.pop();
 
        }
    }
}
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
 
    cin >> N >> M;
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> board[i][j];
        }
    }
    bfs();
    
 
    return 0;
}
Colored by Color Scripter
cs

 

반응형
저작자표시 (새창열림)

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 16932번] 모양 만들기  (0) 2022.01.31
[백준 3190번] 뱀  (0) 2022.01.19
[백준 16985번] Maaaaaaaaaze  (0) 2022.01.16
[백준 14499번] 주사위 굴리기  (0) 2022.01.15
[백준 6443번] 애너그램  (0) 2022.01.14
'알고리즘 문제풀이/백준' 카테고리의 다른 글
  • [백준 16932번] 모양 만들기
  • [백준 3190번] 뱀
  • [백준 16985번] Maaaaaaaaaze
  • [백준 14499번] 주사위 굴리기
슥지니
슥지니
개발 블로그
  • 슥지니
    슥지니의 코딩노트
    슥지니
  • 전체
    오늘
    어제
    • 분류 전체보기 (199)
      • 알고리즘 문제풀이 (158)
        • 백준 (158)
      • 알고리즘 (6)
      • Node.js (2)
        • MongoDB (1)
        • 기타 (1)
      • spring (0)
      • 가상화폐 (1)
        • 바이낸스(Binance) (1)
      • C++ 테트리스 게임 (1)
      • C++ (10)
      • 안드로이드 프로그래밍 (21)
        • 코틀린 (21)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    콘솔 테트리스 게임
    콘솔
    구현
    C
    그래프
    우선순위 큐
    다이나믹 프로그래밍
    자료구조
    백준
    알고리즘
    dp
    C++
    dfs
    Kotlin
    시뮬레이션
    그리디
    코틀린을 활용한 안드로이드 프로그래밍
    백트랙킹
    코틀린
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
슥지니
[백준 2638번] 치즈
상단으로

티스토리툴바