문제링크
https://www.acmicpc.net/problem/16933
16933번: 벽 부수고 이동하기 3
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자.
www.acmicpc.net
풀이
- 벽 부순 횟수 k, 행 r, 열 c 에 대해 BFS 돌린다
- 낮/밤 판별은 이동횟수 % 2 로 할 수 있다
- 이동 안할 때 큐 터지는 것에 주의
- (낮/밤 , k, r, c 로 BFS 돌려도 풀 수 있긴 하다)
코드
#include <bits/stdc++.h> using namespace std; #define all(v) (v).begin(), (v).end() #define rall(v) (v).rbegin(), (v).rend() #define ll long long #define ld long double typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<pair<int, int> > vpi; typedef vector<vector<int>> vvi; typedef pair<ll, ll> pll; typedef tuple<ll, ll, ll> tlll; typedef vector<ll> vl; typedef vector<pair<ll, ll>> vpl; typedef vector<vector<ll>> vvl; typedef vector<string> vs; int dr[4] = {0, 0, 1, -1}; int dc[4] = {1, -1, 0, 0}; // loops #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define F0R(i, a) FOR(i, 0, a) #define ROF(i, a, b) for (int i = (b)-1; i >= (a); --i) #define R0F(i, a) ROF(i, 0, a) #define rep(a) F0R(_, a) #define each(a, x) for (auto &a : x) int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); #if !defined(ONLINE_JUDGE) freopen("../input.txt", "r", stdin); freopen("../output.txt", "w", stdout); #endif // ONLINE_JUDGE int n, m, k; cin >> n >> m >> k; vs v(n); each(e, v) cin >> e; queue<tuple<int, int, int> > q; // k, r, c vector<vvi> vis(k + 1, vvi(n, vi(m))); q.push({0, 0, 0}); vis[0][0][0] = true; int ans = 0; while (q.size()) { ++ans; int tmp = q.size(); while (tmp--) { auto [fk, fr, fc] = q.front(); int isDay = ans % 2; q.pop(); if (fr == n - 1 && fc == m - 1) { cout << ans; return 0; } for (int dir = 0; dir < 4; ++dir) { int nr = fr + dr[dir]; int nc = fc + dc[dir]; int nk = fk; if (nr < 0 || nr >= n || nc < 0 || nc >= m) continue; if (vis[nk][nr][nc]) continue; if (v[nr][nc] == '1') { if (!isDay || fk == k) continue; nk++; } vis[nk][nr][nc] = true; q.push({nk, nr, nc}); } // not move if (!isDay && vis[fk][fr][fc] != 2) { vis[fk][fr][fc] = 2; q.push({fk, fr, fc}); } } } cout << -1; }
728x90
'PS > BOJ' 카테고리의 다른 글
백준 25315번: N수매화검법 (C++) (0) | 2023.06.16 |
---|---|
백준 1441번: 나누어 질까 (C++) (0) | 2023.06.13 |
백준 2186번: 문자판 (0) | 2023.06.10 |
백준 1082번: 방 번호 (0) | 2023.06.10 |
백준 22581번: IkaNumber (0) | 2022.07.12 |