D - その牛BFSをキャッチ

農家は牛の場所を知っている、あなたはそれをつかむしたいです。そして牛農家は、対数軸に点N(0 <= N <= 100000)、点K(0 <= K <= 100000)に位置するウシから始まる農家です。図1に示すように、それぞれがX 2 * X、すべての牛が想定される微小運動を取る気づか農家から移動するために、微小移動を取るXまたはX-1 X + 1、2から移動する:農家は、二つの動きを有しますアクションは、まだ立っていません。それは、少なくとも牛をつかむためにどのくらい時間がかかりますか?入力

ライン:スペースで区切られた2つの文字:  N  と  K

出力

ライン:牛農家は数分で必要な最小時間をつかん

サンプル入力

5 17

サンプル出力

4

ヒント

5-10-9-18-17、4分を次のように農家のプログラムである牛をつかむために最短時間を使用してください。
//長いロング使用
する#include <iostreamの> する#include <CStringの> する#include <キュー> 使用して 名前空間、STD のtypedef ロング ロングLL; N- LL、K; のconst int型 N = 100001 ; INT ARR [N] = { 0 } ; //ステップ数が記録 int型 B [N] = { 0 //タグアレイ;} INT [ 3。 {=] 1 - 、12 }; 無効(BFSをINT スタート){ キュー <LL> S。 S.プッシュ(開始); //入力を開始します B [スタート] = [I]。0 ; //开始赋0 ARR [スタート] = 1 ;标记 一方(s.size()){ LL Q = s.front()。 s.pop();
もし(Q == K){ ブレーク } INT X; 以下のためにint型 i = 0 ; iは< 3 ; iは++ ){ 場合([I] == 2 ){ X = Q * 2 } { X = Q + } もし(X> = 0 && X <= N && ARR [X] == 0 ){ B [X] = B [Q] + 1 ; //新しい追加 s.push(X)を、 ARR [X] = 1 ; IF(x == k)は、k個//もしxアウト到達 ブレーク; } } } } int型のmain(){ 一方(CIN >> N- K){ memsetの(ARR、0はsizeof (ARR)); BFS (N-); COUT << B [K] << ENDL; } }

 

おすすめ

転載: www.cnblogs.com/Accepting/p/11234807.html