オリジナルタイトルリンク:
落谷 https://www.luogu.com.cn/problem/P1135
Aをオルセー情報 http://ybt.ssoier.cn:8088/problem_show.php?pid=1360
トピック:
1360:ストレンジ(有料)
制限時間:1000ミリ秒メモリ制限:65536キロバイト
の提出:4824によって数:2058
説明[タイトル]
建物のエレベーターの各フロアを停止させることができる、i番目の床(1 ≤ I ≤ Nは)上の多数有するK I (0 ≤= K I ≤= Nを)。エレベーターだけで4つのボタン:上、下、上、オフ。上層と下層現在階にその数に等しいです。もちろん、あなたが要件を満たすことができない場合は、対応するボタンが失敗します。例えば:3 3 1 2 5
それが表すK Iを(K 1 = 3 、K 2 = 3 、... ... )、一階から。された最初の階には、押して「アップ」4階、Enterキーを押して「ダウン」にはない仕事、ありませんんので、-2階。だから、床へ数回少なくともYaoanそれはBボタンを構築しますか?
[Enter]を
二行があり、最初の三つは、正の整数は、スペースで区切られた作用表すN 、A 、B (1 ≤ N ≤ 200である、1 ≤ A 、B ≤ N )、第二の動作Nのスペースで区切られた正表す整数K Iを。
[出力]
ライン、即ち、キーストロークの最小数、到達しない場合、出力- 。1。
[サンプル入力】
5 1 5 3 3 1 2 5
[サンプル出力]
3
これは、広範な検索を使用することができ、検索の問題、です。
最初は、キューAを書き込み、Hは、いくつかの手順のためのいくつかの床、Cの電流を表します。
初期設定は、最初にキューに入れられた一階で、
検索処理は、チームの最初の要素は尾を取り出し、その後、床がボタンに到達することができ、フロア内の最初の要素に加え、出力が床に指定回数に達した場合は番号が1ずつインクリメントされると言うことです最後に、検索は次のヘッドに進み++、
ループ条件が空のキュー、すなわち、ヘッド<=尾、
サイクルは、出力に到達していない表す指定階の終わりに達していない場合は-1。
コード:
C:
する#include <stdio.hに> のstruct {K INT H、C; // Hがどのフロア、Cいくつかの手順のために現在表す } A [ 201 ]; // 広い検索キュー int型 B [ 201 ]; // ストアデータ INT YE [ 201 ]; // 床に達したかどうかを記録 整数M、N末端は、R、Sと、 INT 頭部、尾部、 INT (){主 scanfの(" %D%D%D "、およびN-、&R&LT、&S) ; のための(INT I = 1 ; I <= N; I ++)scanfの(" %のD "、B + I) IF(R&LT == S){のprintf(" 0 "); 戻り 0 ;} // 最初の床と行先階が歩行と同じでない場合は A [ 0 ]・H = R&LT; A [ 0 ]の.c = 0 ; // フロア最初にエンキュー テールヘッド= = 0 ; 一方(ヘッド<=尾){ // ワイドキューが空でない条件を循環検索 IF B [A [ヘッド]・H] [ヘッド](A + .H <= N-YE && [A [ヘッド]・H + B [A [ヘッド] .H]] == 0){ // 上がる YE [A [ヘッド]・H + B [A [ヘッド]・H] = 1 ; / / 記録が床になってきた ; ++尾]・H = [ヘッド]・H + B [ヘッド]・H] // キーが追加テール床に到達することができた後に床 [尾] .C = A [ヘッド] .C + 1 ; // の数追加 IF(A [テール] .H == S){のprintf(" %のD "、A [尾] .C); リターン 0 ;} // もし到着階指定された周波数及び出力 } IF [A [ヘッド]・H] [ヘッド](A .hb> = 1 && YE [A [ヘッド] .hb [A [ヘッド]・H] = = 0){ // ダウン YE [A [ヘッド] .hb [A [ヘッド]・H] = 1 ; // 床レコードが経験してきた [++尾]・H = A [ヘッド] .hb [ヘッド]・H]; // テール床を添加到達できるキー後フロア [尾] .C = [ヘッド] .C +を1 ; // 及び回数を追加 IF(A [尾部]・H == S){のprintf(" %のD "、A [尾] .C); 戻り 0 ;} // もし到着階指定された周波数及び出力 } ヘッド ++; // 最初のために。プラス1 } のprintf(「-1 」); 戻り 0 ; // ループは、指定された床の端に到達していない場合は、出力に到達しない表す-1 }
パスカル:
タイプ K = 録音 ;倍長整数:H 倍長整数; C // Hは床、Cいくつかの手順のために現在表し 終了; VARの A:配列 [ 0 .. 200である ] の K; // 広い検索キュー B:アレイ [ 1 .. 200である ] の倍長整数; // ストアデータ YE:配列 [ 1 .. 200である ] のブール; // 記録に達した場合、床 M:倍長整数; N-:倍長整数; R&LT:倍長整数; S:倍長整数; ヘッド:倍長整数; 尾:倍長整数; I:倍長整数; 始める 読む(Nは、R、S); のための I = 1。 の N- 行う読む(B [I])を、 IF R&LT S = 次いで 開始 のwriteln(0);出口(); // 最初のフロア場合同じ行先階に行く必要がないの 終了; Aが[ 0 ]・H = R&LT; A [ 0 ] .C:= 0 ; // 初期床がキューイング :ヘッド = 0 ;尾= ヘッドと、 一方のヘッドを<=尾実行 開始 // ワイドキューが空でない条件を循環検索 IF(A [ヘッド]・H + B [A [ヘッド]・H <= N-)及び(falseにYE [A [ヘッド]・H + B [A [ヘッド]・H] =)そして 始まる // 上がる YE [A [ヘッド]・H + B [A [ヘッド]の.h]]:=真; //は、床が来た記録 尾: =尾の+を1。; [尾]・H: = [ヘッド]・H + B [[ヘッド]の.h]; // 階は、ボタンに到達することができます尾の床に追加 :.C [尾] = [ヘッド] .C + 1。 //; および多数の追加 IFの.h = S [尾]を、その後 始める のwriteln([テール] .Cを);出口() ; // もし到着階指定された周波数及び出力 エンド; エンド; IF [A [ヘッド]・H] [ヘッド](A .hb> = 1)と falseに(YE [A [ヘッド] .hb [A [ヘッド]・H] =)そして 始まる // 下る YE [A [ヘッド]の.h -b [A [ヘッド]の.h]]: =真; // 床が来た記録 尾: =テール+ 。1 ; [尾]・H: = [ヘッド] [[ヘッド]を.H] A .hb; // 階はキーの後、床に到達することができます尾に追加 :[尾] .C = [ヘッド] .C +を1。 //; および数を追加し たIF [尾]・H = S 、その後 始める のwriteln([テール] .Cを);出口(); // それは出力床の指定された数に達した場合は 終了し、 終了; ヘッド: =ヘッド+ 1 ; // 最初のアドオン1に 終わり、 のwriteln( - 1); //サイクルが代わって指定階の終わりに達していない場合には到達できない、出力- 1 エンド。
問題がある場合、私は、よく書くことができ、注意してください、ありがとうございました。