※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 16397번 문제인 탈출이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/16397
16397번: 탈출
첫 번째 줄에 N (0 ≤ N ≤ 99,999), T (1 ≤ T ≤ 99,999), G (0 ≤ G ≤ 99,999)가 공백 하나를 사이에 두고 주어진다. 각각 N은 LED로 표현된 수, T는 버튼을 누를 수 있는 최대 횟수, G는 탈출을 위해 똑같이
www.acmicpc.net
LED에 N이 떠있는 상태를 노드N으로, 버튼 A와 B를 눌러 LED에 떠있는 숫자를 x에서 y로 바꾸는 행위를 노드x에서 노드y로의 간선으로 대응시켜 주어진 문제를 방향그래프로 모델링할 수 있다. 위 그래프에서 노드S에서 노드G까지의 최단거리를 구하고, 그 값을 T와 비교해 문제를 해결하자.
ANG을 출력해야 하는 경우는 (1) S에서 G까지 도달할 수 없거나 (2) 도달할 수 있지만 그 거리가 T보다 큰 경우이다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <queue>
using namespace std;
int N, T, G;
int dist[100000];
void bfs() {
dist[N] = 1;
queue<int> que;
que.push(N);
while (!que.empty()) {
int cur = que.front(); que.pop();
int nxt = cur + 1;
if (nxt < 100000 && dist[nxt] == 0) {
dist[nxt] = dist[cur] + 1;
que.push(nxt);
}
if (cur > 0) {
nxt = cur * 2;
if (nxt > 99999) continue;
int e10 = 100000;
while (e10 > nxt) e10 /= 10;
nxt -= e10;
if (dist[nxt] == 0) {
dist[nxt] = dist[cur] + 1;
que.push(nxt);
}
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> T >> G;
bfs();
int ans = dist[G] - 1;
if (0 <= ans && ans <= T) cout << ans;
else cout << "ANG";
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 25936 // C++] Rain Gauge (0) | 2023.03.13 |
---|---|
[BOJ 5602 // C++] 問題1 (0) | 2023.03.13 |
[BOJ 27659 // C++] Queue skipping (Easy) (0) | 2023.03.11 |
[BOJ 1358 // C++] 하키 (0) | 2023.03.11 |
[BOJ 27660 // C++] Queue skipping (Hard) (0) | 2023.03.11 |