Compy's Blog
342 words
2 minutes
[BOJ] 벽 부수고 이동하기 3
2025-04-14

벽 부수고 이동하기 3

TimeLimitMemoryLimitConditionTAG
2s512MB(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/
Author
뒹굴뒹굴 이정훈 공부방
Published at
2025-04-14