https://www.acmicpc.net/problem/14442
2206번 벽부수고 이동하기를 짜고 바로 이 문제를 푸니까 같은 방법으로 빠르게 짤 수 있었다.
https://j2wooooo.tistory.com/40 벽부수고 이동하기 코드와 별반 다르지 않다. 코드 3줄 정도 바뀐듯?
이제 bfs를 이용하여 조건에 따라 탐색해 나가는 방법은 3차원 visited 배열 (+ 비트마스킹)으로 풀어야 한다는 것을!! 명확하게 머릿속에 집어넣은 것 같다!!!!
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 | #include<iostream> #include<queue> #include<string> using namespace std; int N, M, K; int ans = 1; bool flag; int dx[4] = { 0,0,-1,1 }; int dy[4] = { 1,-1,0,0 }; queue < pair<pair<int, int>, int>>q; int map[1001][1001]; bool visited[1001][1001][11]; int main(void) { string str; cin >> N >> M >> K; for (int i = 1; i <= N; i++) { cin >> str; for (int j = 1; j <= M; j++) { map[i][j] = str[j - 1]; } } q.push(make_pair(make_pair(1, 1), 0)); visited[1][1][0] = true; while (!q.empty()) { int qsize = q.size(); while (qsize--) { int x = q.front().first.first; int y = q.front().first.second; int gowall = q.front().second; q.pop(); if (x == N && y == M) { flag = true; break; } for (int i = 0; i < 4; i++) { int mx = x + dx[i]; int my = y + dy[i]; int ngowall = map[mx][my] - '0'; if (mx >= 1 && mx <= N && my >= 1 && my <= M) { if ((gowall + ngowall) > K) continue; // 벽을 k번 까지 부술 수 있다. k번이 넘어가면 continue ngowall += gowall; if (visited[mx][my][ngowall]) continue; q.push(make_pair(make_pair(mx, my), ngowall)); visited[mx][my][ngowall] = true; } } } if (flag) break; else ans++; } if (flag) cout << ans; else cout << -1; return 0; } | cs |
'Problem > BFS' 카테고리의 다른 글
[백준알고리즘] 13460번 구슬 탈출2 (1) | 2019.01.04 |
---|---|
[백준알고리즘] 9328번 열쇠 (0) | 2019.01.02 |
[백준알고리즘] 2206번 벽 부수고 이동하기 (0) | 2018.12.27 |
[백준알고리즘] 1194번 달이 차오른다, 가자 (0) | 2018.12.26 |
[백준알고리즘] 2644번 촌수계산 (0) | 2018.11.20 |