342 words
2 minutes
[BOJ] 벽 부수고 이동하기 3
TimeLimit | MemoryLimit | Condition | TAG |
---|---|---|---|
2s | 512MB | (1 ≤ N, M ≤ 1000 1 ≤ K ≤ 10) | Implementation, BFS |
전형적인 BFS 문제로 연습하기 좋은 문제인 것 같습니다.
정답 코드
#include <iostream>
#include <queue>
using namespace std;
using ll = long long;
int n, m, k;
char board[1001][1001];
ll visited[1001][1001][11][2];
ll solution(){
queue<pair<pair<int, bool>, pair<int, int>>> q;
q.push({{0, false}, {0, 0}});
visited[0][0][0][0] = 0; // 0 ㄴㅏㅈ, 1 ㅂㅏㅁ
visited[0][0][0][1] = 1; // 0 ㄴㅏㅈ, 1 ㅂㅏㅁ
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, -1, 1};
while(!q.empty()){
auto [__, _] = q.front(); q.pop();
auto [y, x] = _;
auto [ck, state] = __;
for(int i = 0; i < 4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(0 <= nx && nx < m && 0 <= ny && ny < n){
if(board[ny][nx] == '1'){
if(ck >= k) continue;
if(visited[ny][nx][ck+1][!state] <= visited[y][x][ck][state] + 1) continue;
if(state){
visited[y][x][ck][!state] = min(visited[y][x][ck][state] + 1, visited[y][x][ck][!state]);
q.push({{ck, !state}, {y, x}});
continue;
}
visited[ny][nx][ck+1][!state] = visited[y][x][ck][state] + 1;
q.push({{ck+1, !state}, {ny, nx}});
}else{
if(visited[ny][nx][ck][!state] <= visited[y][x][ck][state] + 1) continue;
visited[ny][nx][ck][!state] = visited[y][x][ck][state] + 1;
q.push({{ck, !state}, {ny, nx}});
}
}
}
}
ll result = 1e15;
for(int i = 0; i <= k; i++) {
result = min(result, min(visited[n-1][m-1][i][0], visited[n-1][m-1][i][1]));
}
//
// for(int i = 0; i < n; i++){
// for(int j = 0; j < m; j++){
//
// cout << visited[i][j][7][0] << " ";
// }
// cout << "\n";
// }
//
// cout << "\n";
return result+ 1LL;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> k;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> board[i][j];
for(int t = 0; t <= k; t++){
visited[i][j][t][0] = 1e15;
visited[i][j][t][1] = 1e15;
}
}
}
ll result = solution();
if(result >= 1e15) cout << -1;
else cout << result;
return 0;
}
[BOJ] 벽 부수고 이동하기 3
https://compy07.github.io/Blog/posts/boj/16933/