白駿16953号(ジャワ)


BFS


BFSを用いて白駿16953号をJavaと解釈した.これは想像以上に簡単な問題のようで、実際にはすぐにコードを完成して提出しましたが、結果はずっと間違っていました.IntelliJで自分で値を入力したときは効果的でしたが、なぜいつもミスをしているのか、本当にわかりません.
最後に他の人の解答を参考にして、変数のタイプはintではなくlongであるべきであることは発見されなかった.これまでアルゴリズム学習は多くなく,いつあるアルゴリズムを用いる必要があるか,入力値の範囲に応じて適切なtypeを選択することも未熟であった.

与えられた入力値の範囲は20億を超えないに違いないが、なぜlongを使うのか、私は一人でしばらく悩んだ.

どうしてlongを使うの?


5億を10億にすると、2つの演算のうち、最後の演算でプラス1の演算を行うと、Queueは50億+1が必要になるのでオーバーフローが発生します!intではなくlongを使用する必要があります.
次は私が提出したコードです.
import java.util.*;
import java.io.*;

public class boj16953 {
    static long a,b;
    static int cnt;

    static int bfs(){
        Queue<Long> q = new LinkedList<>();
        q.add(a);

        while(!q.isEmpty()){
            int size = q.size();

            for(int i=0; i<size; i++){
                long tmp = q.poll();
                if(tmp==b)
                    return cnt+1;

                if(tmp*2<=b) q.add(tmp*2);
                if(tmp*10+1<=b) q.add(tmp*10+1);
            }
            cnt++;
        }
        return -1;
    }

    public static void main(String args[]) throws IOException {
        BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk = new StringTokenizer(bfr.readLine());

        a = Long.parseLong(stk.nextToken());
        b = Long.parseLong(stk.nextToken());

        System.out.println(bfs());
    }
}