総病院のエレベーターは、おそらくバグをたくさん作っhykバグがあり、エレベーターは2つのボタンのみが、「上」と「下」、各フロアにエレベーターを停止させることができ、各フロアには、番号のKi(0 <=のKiを<持っています= n)は、あなたが床にあるとき、あなたはボタン「上」を押す1 + K1を層にし、あなたは、「次へ」キーが1-K1層に移動します押してください。もちろん、エレベーターはNが1以下に低減することができない以上上昇することはできません。例えば、5階建ての建物、K1 = 3、K2 = 3 、K3 = 1、K4 = 2、K5 = 5。あなたはそれが負の話に来ることができない知っているので、第一層の当初から、あなたはボタン「上」を押すことができ、その後、4階に、あなたは、ボタンならば、エレベーターが第一層「下」のプレスで行うことができません。二階のマイナスは存在しません。
だから、あなたは、少なくともそれを押す必要が何回「アップ」または「ダウン」ボタン、層からB層にしたいですか?入力入力は、各テストケースは、2つの行を含むいくつかのテストケースから構成されています。
最初の行は、N、Bの3つの整数を含む(1 < = nで、<= 200 b)に示すように、 上述したように、第二のラインは、n個の整数K1、K2が含ま、... .kn。
0は、単一の入力の終了を示します。それぞれの場合の入力と出力の出力整数、最小数のレイヤーにあるとき、あなたはボタンを押す必要があり、あなたはB層をしたいです。あなたはB層に到達できない場合は、印刷「-1。」
サンプル入力
5 1 5 3 3 1 2 5 0
サンプル出力
3
は(I)回旋BFS、コード乱成一锅粥あります。
時が可能で、境界を決定するために、キュー(リアルタイムで更新?)に変わりはなく合格(またはループを無限ます)。
1つの#include <iostreamの> 2の#include <キュー> 3。の#include <cstdioを> 4。の#include <CStringの> 5。 使用した 名前空間STD; 6 int型N-、A、B、 7 INT NUM [ 205 ]; 8 BOOL VIS [ 205 ] ; 9 構造体ノード 10 { 11。 INT X; // 現在の位置 12である INTステップ; // 現在の行くためにステップ数 13である }、今nextt; 14 INT BFS(INT X) 15 { 16 キュー<ノード> Q; 17 now.x = X; // 位置初期 18は now.step = 0 ; // 初期化手順の現在の数 。19 (今)q.push; 20は 、一方(!Q.空の()) 21である { 22である )今q.front =(; /// チームトップ要素の現在のノード 23は q.pop(); // ポップ 24を IF(now.x == B)// 端に達した場合 25 リターンnow.step; 26は = nextt 今; 27 + NUM = now.x nextt.x [now.x]; // 次のノード位置が現在の位置に加えて取ることができるステップ数である 28は、 IF(nextt.x> = 1 && nextt.x <= N-VIS && 【nextt.x] == 0 ) 29 { 30 nextt.step = now.step + 1 ; // 移動するステップ数+1し 31である VIS [nextt.x] = 1 ; 32 q.push(nextt); 33です } 34である nextt.x = now.x - NUM [now.x]; // 現在の位置が移動することができ減算して次のノードの位置のステップ数 35を IF(nextt.x> = 1 && nextt.x <= N- VIS && [nextt.x] == 0 ) 36 { 37 nextt.step = now.step + 1。// 走的步数+1 38 VIS [nextt.x] = 1 。 39 q.push(nextt)。 40 } 41 } 42 リターン - 1 。 43 } 44 のint main()の 45 { 46 int型の和= 0 。 47 一方(scanf関数(" %D "!、&N)&& N = 0 ){ 48 CIN >> A >> B。 49 のmemset(NUM、0、はsizeof (NUM))。 50 のmemset(VIS、0、はsizeof (VIS))。 51 のためには、(int型、I = 1 ; I <= N; I ++ ) 52 CIN >> NUM [I]。 53 和= BFS(A)。 54 coutの<<合計<< てendl; 55 } 56 リターン 0 。 57 }