bfs--エレベーター

総病院のエレベーターは、おそらくバグをたくさん作っ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 }

 

おすすめ

転載: www.cnblogs.com/very-beginning/p/11781179.html