アルゴリズム::白準::BFS::13913::かくれんぼ4
13123 ワード
質問する
質問へのアクセス
問題を理解する
アルゴリズム::白準::BFS::1697:鬼ごっこ(velog.io)題が延長されました.
track
が作成される.この配列は、i
インデックスにその前の位置を記録します.例えば、
i
から10
までの後の格子であり、9
である.track[9] = 10
から5
に瞬時に移動すると10
となる. track[10] = 5
アレイを使用して、任意の場所にアクセスするかどうかを確認します.したがって、visited[]
の情報を信頼できます.track[i]
は、1回のみ記憶される.track[i]
から5
に瞬時に移動した場合は10
である.track[10] = 5
から1マス後ろに移動する場合、11
は既にアクセスしたポイントなので後ろに移動しません.したがって、
10
は常に信頼できるものである.track[10] = 5
に到達した場合は、K
~K
の値を出力できます.コード#コード#
#include <iostream>
#include <vector>
#include <queue>
#define MAX 100001
using namespace std;
int N, K, track[MAX];
bool visited[MAX];
// 재귀여도 최대 20~30번 돌기 때문에 빠릅니다.
void traceTrack(int s, int e) {
if (s != e) traceTrack(s, track[e]);
cout << e << ' ';
}
void solve() {
queue<pair<int, int>> q;
q.push({N, 0});
visited[N] = true;
int ans = 0;
while (!q.empty()) {
int cPos = q.front().first, cSec = q.front().second;
if (cPos == K){ ans = cSec; break; }
q.pop();
int nPos1 = cPos * 2, nPos2 = cPos - 1, nPos3 = cPos + 1, nSec = cSec + 1;
if (nPos1 < MAX && !visited[nPos1])
q.push({nPos1, nSec}), visited[nPos1] = true, track[nPos1] = cPos;
if (nPos2 >= 0 && !visited[nPos2])
q.push({nPos2, nSec}), visited[nPos2] = true, track[nPos2] = cPos;
if (nPos3 < MAX && !visited[nPos3])
q.push({nPos3, nSec}), visited[nPos3] = true, track[nPos3] = cPos;
}
cout << ans << '\n';
traceTrack(N, K);
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> N >> K;
if (N > K) {
cout << N - K << '\n';
for (int i = N; i >= K; --i) cout << i << ' ';
return 0;
}
solve();
}
結果
Reference
この問題について(アルゴリズム::白準::BFS::13913::かくれんぼ4), 我々は、より多くの情報をここで見つけました https://velog.io/@embeddedjune/알고리즘-백준-BFS-13913-숨바꼭질4-2mm6lpgzテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol