알고리즘 모음(C++)

백준 13903 - 출근(C++) 본문

백준

백준 13903 - 출근(C++)

공대생의 잡다한 사전 2023. 10. 10. 23:49

문제 링크입니다. https://www.acmicpc.net/problem/13903

 

13903번: 출근

첫 번째 줄에는 보도블록의 세로, 가로 R, C(1 ≤ R, C ≤ 1,000)크기가 주어진다. 다음 R개의 줄에는 C개의 문자로 이루어진 보도블록의 초기 상태가 주어진다. (가로 블록은 0로 표시되고, 세로 블록

www.acmicpc.net

BFS를 이용한 문제입니다.

 

 

자세한 것은 코드를 참고해주세요.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#define INF 987654321
#define F first
#define S second

using namespace std;

int R, C, N;
int dx[11];
int dy[11];
int map[1001][1001];
int check[1001][1001];
int ans = INF;
queue<pair<pair<int, int>, int>> q;

void bfs(){
    while(!q.empty()){
        int x = q.front().F.F;
        int y = q.front().F.S;
        int cnt = q.front().S;
        q.pop();
        if(x == R) ans = min(ans, cnt);
        for(int i = 0; i < N; i++){
            int xx = x + dx[i];
            int yy = y + dy[i];
            if(xx >= 1 && xx <= R && yy >= 1 && yy <= C){
                if(check[xx][yy] == 1) continue;
                if(map[xx][yy] == 1){
                    check[xx][yy] = 1;
                    q.push({{xx, yy}, cnt + 1});
                }
            }
        }
    }
}

void solve(){
    for(int i = 1; i <= C; i++){
        if(map[1][i] == 1){
            q.push({{1, i}, 0});
            check[1][i] = 1;
        }
    }
    bfs();
    if(ans == INF) cout << "-1";
    else cout << ans;
}

int main() {
    cin.tie(0);
    cout.tie(0);
    cin >> R >> C;
    for(int i = 1; i <= R; i++){
        for(int j = 1; j <= C; j++){
            cin >> map[i][j];
        }
    }
    cin >> N;
    for(int i = 0; i < N; i++){
        cin >> dx[i] >> dy[i];
    }
    solve();
    return 0;
}

 

 

질문 및 조언은 댓글을 남겨주세요.

'백준' 카테고리의 다른 글

백준 10813 - 공 바꾸기(C++)  (0) 2023.10.13
백준 10810 - 공 넣기(C++)  (0) 2023.10.13
백준 25418 - 정수 a를 k로 만들기(C++)  (0) 2023.10.08
백준 5341 - Pyramids(C++)  (0) 2023.10.08
백준 17025 - Icy Perimeter(C++)  (1) 2023.10.03