白駿アルゴリズム1697号:鬼ごっこ


リンク


https://www.acmicpc.net/problem/1697

質問する


秀斌は弟と隠れん坊をしている.秀彬は現在点N(0≦N≦100000)、弟は点K(0≦K≦100000)にいる.スビンは歩いたり瞬時に移動したりすることができます秀彬の位置がXであれば、1秒後にX-1またはX+1に移動します.瞬間移動なら1秒後に2*Xの位置に移動します.
もし秀彬と弟の位置があれば、秀彬が弟を探す最も速い時間は数秒後であることを求めるプログラムを書きます.

入力


一行目はスビンのポジションNと弟のポジションKNとKは整数です.

しゅつりょく


秀彬が弟を探している一番速い時間を印刷します.

入力と出力の例、ヒント



プールコード(C++)

// 1697번 : 숨바꼭질(실버 1)

#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define MAX 100001

using namespace std;

int dist[MAX];
int n, k;

int main()
{
    fastio;
    cin >> n >> k;
    memset(dist, -1, sizeof(dist)); // 모든 거리를 -1로 초기화 시킨다
    queue<int> Q;
    dist[n] = 0;
    Q.push(n);
    while (!Q.empty())
    {
        int cur = Q.front(); // 현재 큐에 있는 좌표
        Q.pop();
        for (int i : {cur + 1, cur - 1, 2 * cur})
        {
            if (i < 0 || i > MAX - 1)
            {
                continue;
            }
            if (dist[i] != -1)
                continue;
            dist[i] = dist[cur] + 1;
            Q.push(i);
            if (i == k)
                break;
        }
    }
    cout << dist[k];
    return 0;
}

ふくガス


私は問題が何を求めるべきか、どのように解くべきかを理解したが、現在の位置では2を乗じた値を表現できなかったので、解くことができず、最後に理解を見た.
foreach文の文法が分からなかったので、この問題はできなかったので、後でやるつもりです.