トピックの説明
ふふ、ある日、私はとても奇妙なエレベーターの夢を見ました。エレベーターは建物の各階に停止することができ、i 階 (1≤i≤N) には Ki (0≤Ki ≤N) という番号があります。エレベーターには、開く、閉じる、上がる、下がるの 4 つのボタンしかありません。上下の階数は現在の階数と同じになります。もちろん、要件が満たされていない場合、対応するボタンは無効になります。例: 3、3、1、2、5 は、フロア 1 から始まる Ki (K1 = 3、K2 = 3、…) を表します。1 階で「上」を押して 4 階に移動します。-2 階がないため「下」を押しても機能しません。では、建物 A から建物 B に移動するために必要なボタンを押す最小回数は何回でしょうか?
入力フォーマット
全部で2行あります。
最初の行はスペースで区切られた 3 つの正の整数で、N、A、B (1≤N≤200、1≤A、B≤N) を表します。
2 行目はスペースで区切られた N 個の非負の整数であり、Ki を表します。
出力フォーマット
1行、つまり最小キー押下回数に達しない場合は出力されます
-1
。入力サンプルと出力サンプル
入力
5 1 5 3 3 1 2 5出力
3指示/ヒント
データの 100% の場合、1≤N≤200、1≤A、B≤N、0≤Ki ≤N。
#include<bits/stdc++.h>
using namespace std;
int n,a,b,e[210],vis[210];
int main()
{
cin>>n>>a>>b;
for(int i=1;i<=n;i++)
{
cin>>e[i];
}
queue<int>f;
queue<int>s;
f.push(a);
s.push(0);
vis[a]=1;
while(!s.empty())
{
if(f.front()==b)
{
cout<<s.front()<<endl;
return 0;
}
int t=f.front()+e[f.front()];//上升楼层
if(t<=n&&vis[t]==0)
{
f.push(t);
s.push(s.front()+1);
vis[t]=1;
}
t=f.front()-e[f.front()];//下降楼层
if(t>=1&&vis[t]==0)
{
f.push(t);
s.push(s.front()+1);
vis[t]=1;
}
f.pop();
s.pop();
}
cout<<-1<<endl;
return 0;
}