※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 13903번 문제인 출근이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/13903
13903번: 출근
첫 번째 줄에는 보도블록의 세로, 가로 R, C(1 ≤ R, C ≤ 1,000)크기가 주어진다. 다음 R개의 줄에는 C개의 문자로 이루어진 보도블록의 초기 상태가 주어진다. (가로 블록은 0로 표시되고, 세로 블록
www.acmicpc.net
주어진 세로블록들을 노드로, 각 블록에서 이동할 수 있는 블록으로의 이동을 에지로 나타내 문제의 상황을 그래프로 모델링할 수 있다. 위 모델을 이용하면, 주어진 문제는 첫 행의 세로블록들을 출발점들로, 마지막 행의 세로블록들을 도착점들로 생각하는 최단거리 문제로 생각할 수 있다.
각 에지의 가중치가 일정하므로 BFS를 이용해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int R, C;
int board[1000][1000];
int dist[1000][1000];
int cnt;
int dr[10], dc[10];
void bfs() {
queue<pair<int, int>> que;
for (int c = 0; c < C; c++) {
if (board[0][c]) dist[0][c] = 1, que.push(make_pair(0, c));
}
while (!que.empty()) {
int r = que.front().first, c = que.front().second; que.pop();
for (int i = 0; i < cnt; i++) {
int rr = r + dr[i], cc = c + dc[i];
if (-1 < rr && rr < R && -1 < cc && cc < C && board[rr][cc] && dist[rr][cc] == 0) {
dist[rr][cc] = dist[r][c] + 1;
que.push(make_pair(rr, cc));
}
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> R >> C;
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) cin >> board[r][c];
}
cin >> cnt;
for (int i = 0; i < cnt; i++) cin >> dr[i] >> dc[i];
bfs();
int ans = 1000000007;
for (int c = 0; c < C; c++) {
if (dist[R - 1][c]) ans = min(ans, dist[R - 1][c]);
}
if (ans == 1000000007) cout << -1;
else cout << ans - 1;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 13912 // C++] 외계 생물 (0) | 2023.03.26 |
---|---|
[BOJ 13911 // C++] 집 구하기 (0) | 2023.03.25 |
[BOJ 13910 // C++] 개업 (0) | 2023.03.23 |
[BOJ 13909 // C++] 창문 닫기 (0) | 2023.03.22 |
[BOJ 13908 // C++] 비밀번호 (0) | 2023.03.21 |