728x90

 0. [c++] 백준


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


 1. 풀이


메모이제이션과 BFS방식을 섞어서 문제를 풀어보았다.

visited는 x,y의 위치 이외에 추가적으로 벽을 부수었는가의 여부를 저장해주었다.

반복문에서 깔끔하게 정리하기 위해 큐에 모든 경우를 넣은 이후, pop을 해주면서 방문했는지를 체크해주었다.


한번 visited[x][y] = true가 된 이후 다시 등장한다면, count만 더 커진 경우이므로 경로 체크에서 제외시켜주는 방식으로 구현이 되어있다.


벽이 막힌 경우라면 무조건 벽을 뚫고 이동이 가능하다면 이동을 우선적으로 하도록 설계하였다.


이런 방식으로 상하좌우 이동을 하고 그 이동을 qu 에 저장해주었고, N,M의 위치에 도달하면 그때 count를 출력해주었다.


 2. 소스코드


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
84
85
86
87
88
89
90
#include<iostream>
#include<string>
#include<queue>
 
using namespace std;
 
int N, M;
//arr[y][x];
int arr[1001][1001];
//qu.first.first = 현재 x, qu.first.second = 현재 y
//qu.second.first = 벽을 부수었는가? , qu.second.second = 이동횟수
queue<pair<pair<intint>pair<intint> > > qu;
//visited[y][x][k] = y,x 위치를 방문하였는가, k는 벽을 부수었는지 여부
bool visited[1001][1001][2];
 
int bfs() {
    while (!qu.empty()) {
        pair<intint> here = qu.front().first;
        int y = here.first;
        int x = here.second;
        int k = qu.front().second.first;
        int count = qu.front().second.second;
        qu.pop();
 
        if (visited[y][x][k])
            continue;
 
        visited[y][x][k] = true;
 
        if (y == N - 1 && x == M - 1)
            return count + 1;
 
        //상하좌우로 이동
        //상
        if (y > 0) {
            if (arr[y - 1][x] == 0) {
                qu.push({ {y - 1,x}, {k, count + 1} });
            }
            else if (k == 0) {
                qu.push({ {y - 1,x}, {1, count + 1} });
            }
        }
        //하
        if (y < N - 1) {
            if (arr[y + 1][x] == 0) {
                qu.push({ {y + 1,x}, {k, count + 1} });
            }
            else if (k == 0) {
                qu.push({ {y + 1,x}, {1, count + 1} });
            }
        }
        //좌
        if (x > 0) {
            if (arr[y][x - 1== 0) {
                qu.push({ {y,x - 1}, {k, count + 1} });
            }
            else if (k == 0) {
                qu.push({ {y,x - 1}, {1, count + 1} });
            }
        }
        //우
        if (x < M - 1) {
            if (arr[y][x + 1== 0) {
                qu.push({ {y,x + 1}, {k, count + 1} });
            }
            else if (k == 0) {
                qu.push({ {y,x + 1}, {1, count + 1} });
            }
        }
    }
 
    return -1;
}
 
int main() {
    string s;
    cin >> N >> M;
    for (int i = 0; i < N; i++) {
        cin >> s;
        for (int j = 0; j < M; j++) {
            arr[i][j] = s[j] - 48;
        }
    }
 
    qu.push({ {0,0}, {0,0} });
 
    cout << bfs() << endl;
 
    return 0;
}
cs


 3. 참고



질문이나 지적 있으시면 댓글로 남겨주세요~

도움 되셨으면 하트 꾹!


'<백준> > DFS와 BFS' 카테고리의 다른 글

[c++] 백준 13460 - 구슬 탈출 2  (0) 2023.10.09
[C++] 백준 1697 - 숨바꼭질(BFS)  (0) 2020.03.03
[C++] 백준 1012 - 유기농 배추(DFS)  (0) 2020.03.03

+ Recent posts