티스토리 뷰
https://www.acmicpc.net/problem/13913
13913번: 숨바꼭질 4
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
https://www.acmicpc.net/problem/1697 문제와 똑같이 풀면 되는데 방문했던 경로를 출력해야 하는 문제이다.
1차원 배열에 대해 BFS를 수행한다고 생각하고, -1일때, +1일때, *2일때를 조건문으로 조사하면 된다.
내가 생각한 방법은 다음과 같다.
1. 먼저 -1, +1, *2에 대해 BFS를 수행해서 최단거리가 몇초인지 구한다. (*0 이하일때 -1 하지 않기, 10만 이상일때 *2 하지 않기등 예외처리 하기, 시작점은 0초임을 주의하기)
2. 이후 동생의 점을 시작점으로 하여 수빈이의 점에 도착할 때 까지 BFS 수행하고, 이때의 경로는 저장해두기
3. 2에서 저장한 경로 뒤집기(동생 -> 수빈의 경로이기 때문에 반대로 뒤집어야 수빈이 -> 동생 경로가 된다)
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX 200010
int n, k;
int board[MAX];
int dist[MAX];
bool vis[MAX];
queue <int> q;
vector <int> v;
void input()
{
cin >> n >> k;
}
int solve()
{
q.push(n);
vis[n] = true;
int res = 0;
while(!q.empty())
{
int cur = q.front(); q.pop();
if (cur == k)
{
res = dist[cur]; break;
}
if (cur > 0 && !vis[cur - 1])
{
q.push(cur - 1);
vis[cur - 1] = true;
dist[cur - 1] = dist[cur] + 1;
}
if (cur < MAX && !vis[cur + 1])
{
q.push(cur + 1);
vis[cur + 1] = true;
dist[cur + 1] = dist[cur] + 1;
}
if ((cur < 100000) && !vis[cur * 2])
{
q.push(cur * 2);
vis[cur * 2] = true;
dist[cur * 2] = dist[cur] + 1;
}
}
while (!q.empty()) q.pop();
v.push_back(k);
int t = res - 1;
q.push(k);
while (!q.empty())
{
int cur = q.front(); q.pop();
if (cur == n)
break;
if (dist[cur + 1] == t && vis[cur+1])
{
q.push(cur + 1);
v.push_back(cur + 1);
}
else if (dist[cur - 1] == t && vis[cur-1])
{
q.push(cur - 1);
v.push_back(cur - 1);
}
else
{
q.push(cur / 2);
v.push_back(cur / 2);
}
t--;
}
reverse(v.begin(), v.end());
return res;
}
int main()
{
cin.tie(0); ios::sync_with_stdio(0);
input(); cout << solve() << "\n";
for (auto i : v)
cout << i << ' ';
}
'PS > 백준' 카테고리의 다른 글
(C++) [백준 16933번] 벽 부수고 이동하기 3 (0) | 2022.07.04 |
---|---|
(C++) [백준 14442번] 벽 부수고 이동하기 2 (0) | 2022.06.30 |
(C++) [백준 1600번] 말이 되고픈 원숭이 (0) | 2022.06.30 |
(C++) [백준 2146번] 다리 만들기 (0) | 2022.06.27 |
(C++) [백준 2573번] 빙산 (0) | 2022.06.23 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 5397
- 17071
- 상범 빌딩
- 2493
- 3190번
- 1251
- SWEA
- 3197
- 백준
- 6593
- PS
- 3273
- 16920
- 벽 부수고 이동하기 3
- 2583
- 숨바꼭질 5
- BOJ
- 16933
- 2146
- 파핑파핑 지뢰찾기
- 5427
- 9328
- 6603
- 1475
- 벽 부수고 이동하기 2
- 숨바꼭질 4
- 구름톤챌린지
- 두 수의 합
- DX부문
- 확장 게임
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함