PS (C, C++)
[백준/C++] 13903 출근
최연재
2024. 11. 16. 08:16
https://www.acmicpc.net/problem/13903
코드
#include <iostream>
#include <queue>
#include <climits>
using namespace std;
#define FASTIO ios::sync_with_stdio(false); cin.tie(NULL);
#define MAX 1001
typedef pair<int, int> pi;
int r, c, arr[MAX][MAX], n, ans = INT_MAX, dx[11], dy[11];
bool visit[MAX][MAX];
queue<pair<pi, int>> q;
void bfs() {
while (!q.empty()) {
int nx = q.front().first.first;
int ny = q.front().first.second;
int cnt = q.front().second;
q.pop();
if (nx == r - 1) {
ans = min(ans, cnt);
return;
}
for (int i = 0; i < n; i++){
int gx = nx + dx[i];
int gy = ny + dy[i];
if (gx >= 0 && gx < r && gy >= 0 && gy < c && !visit[gx][gy] && arr[gx][gy]) {
q.push({ { gx, gy } , cnt + 1});
visit[gx][gy] = true;
}
}
}
}
int main() {
FASTIO;
cin >> r >> c;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cin >> arr[i][j];
if (i == 0 && arr[i][j] == 1) {
q.push({ { 0, j }, 0 });
visit[0][j] = true;
}
}
}
cin >> n;
for (int i = 0, a, b; i < n; i++)
cin >> dx[i] >> dy[i];
bfs();
if (ans == INT_MAX) cout << -1;
else cout << ans;
return 0;
}
설명
첫 번째 행에서 출발해 마지막 행에 도착 가능한지 보면 됩니다.
이를 위해 주어지는 이동 규칙을 이용해 bfs를 돌립니다.
마지막에 ans값이 초기 설정한 값이라면 도착 불가능이니 -1을 출력합니다. 그렇지 않을 경우 ans값을 출력하면 됩니다.
느낀 점
시간초과로 한 번 틀렸습니다.. bfs를 첫 번째 행에서 매번 진행해서 발생한 문제라 한 번만 수행하도록 바꿔주니 한 번에 맞았습니다!