오답노트
[BFS] BOJ 13913번 숨박꼭질 4 본문
https://www.acmicpc.net/problem/13913
13913번: 숨바꼭질 4
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
- 문제 파악
수빈이의 위치와 동생의 위치가 정수로 주어지고 1차원 배열에서 수빈이 위치에서 동생 위치로 가는 최소 시간과 경로를 출력하라
-정답
주의가 필요했던 점
1. 수빈이 위치에서 동생 위치로 가는 최소 경로 출력
메모리 초과 발생하여 경로를 저장하는 배열을 조건문안에 넣어 최대한 메모리를 덜 차지하도록 했다.
2. 수빈이와 동생의 위치 차이가 동일할 때
아예 BFS 시작하기 전에 처리 해버리고 프로그램을 끝내버린다.
#include "bits/stdc++.h"
using namespace std;
int pos[100002];
int check[100002];
int output[100002];
queue<int> q;
void func(int x, int k)
{
int nCmp = check[x];
if (!check[x] || check[x] == -1)
{
check[x] = check[k] + 1;
q.push(x);
if (!pos[x])
pos[x] = k;
}
else
{
check[x] = min(check[k] + 1, check[x]);
if (nCmp != check[x])
{
q.push(x);
if (!pos[x])
pos[x] = k;
}
}
}
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int n, m;
cin >> n >> m;
if (n == m)
{
cout << 0 << "\n";
cout << n;
return 0;
}
check[n] = 0;
check[m] = -1;
pos[n] = -1;
q.push(n);
while (!q.empty())
{
int k = q.front();
q.pop();
if (k == m)
break;
int x1 = k - 1,
x2 = k + 1,
x3 = k * 2;
if (x1 >= 0)
func(x1, k);
if (x2 <= 100000)
func(x2, k);
if (x3 <= 100000)
func(x3, k);
}
cout << check[m] << "\n";
int j = m;
int x = 0;
while (pos[j] != -1)
{
output[x++] = pos[j];
j = pos[j];
}
reverse(output, output + x);
for (int i = 0; i < x ; i++)
cout << output[i] << " ";
cout << m;
}
'C,C++ > 코딩테스트' 카테고리의 다른 글
[시뮬레이션] BOJ 16935번 배열 돌리기 3 (0) | 2022.05.24 |
---|---|
[BFS] BOJ 13549번 숨바꼭질 3 (0) | 2022.05.22 |
[그래프] BOJ 2667번 단지번호붙이기 (0) | 2022.05.21 |
[그래프] BOJ 11724번 연결 요소의 개수 (0) | 2022.05.21 |
[그래프] BOJ 10866번 덱 (0) | 2022.05.17 |